factorysemantics-mes 0.3.0__tar.gz → 0.4.0__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 (1023) hide show
  1. factorysemantics_mes-0.4.0/.github/scripts/assistant_folder_from_the_wheel.py +186 -0
  2. factorysemantics_mes-0.4.0/.github/scripts/doctor_writes_nothing_of_yours.py +336 -0
  3. factorysemantics_mes-0.4.0/.github/scripts/plant_from_shape.py +560 -0
  4. factorysemantics_mes-0.4.0/.github/scripts/recover_a_half_dead_plant.py +213 -0
  5. factorysemantics_mes-0.4.0/.github/scripts/two_nodes_on_one_box.py +369 -0
  6. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/workflows/ci.yml +242 -0
  7. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/workflows/release.yml +9 -2
  8. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/CHANGELOG.md +248 -1
  9. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/CITATION.cff +2 -2
  10. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/PKG-INFO +12 -2
  11. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/README.md +11 -1
  12. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docker/Dockerfile +12 -0
  13. factorysemantics_mes-0.4.0/docker/docker-compose.redundant.yml +184 -0
  14. factorysemantics_mes-0.4.0/docker/nginx.redundant.conf +42 -0
  15. factorysemantics_mes-0.4.0/docker/redundant/fleet.toml +13 -0
  16. factorysemantics_mes-0.4.0/docker/redundant/plant.toml +74 -0
  17. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ARCHITECTURE.md +1 -1
  18. factorysemantics_mes-0.4.0/docs/assets/walk.gif +0 -0
  19. factorysemantics_mes-0.4.0/docs/decisions/0042-one-plant-many-nodes.md +127 -0
  20. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/index.md +1 -0
  21. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/agentic-harness.md +1 -1
  22. factorysemantics_mes-0.4.0/docs/design/pack-in-pack.md +100 -0
  23. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/index.md +9 -0
  24. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/deploy.md +1 -0
  25. factorysemantics_mes-0.4.0/docs/operate/doctor.md +109 -0
  26. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/first-plant.md +35 -5
  27. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/fleet.md +49 -0
  28. factorysemantics_mes-0.4.0/docs/operate/images/shape-equipment.png +0 -0
  29. factorysemantics_mes-0.4.0/docs/operate/images/shape-timeline.png +0 -0
  30. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/index.md +1 -0
  31. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/packs.md +2 -1
  32. factorysemantics_mes-0.4.0/docs/operate/plant-from-your-mes.md +423 -0
  33. factorysemantics_mes-0.4.0/docs/operate/redundancy.md +395 -0
  34. factorysemantics_mes-0.4.0/docs/operate/run-it-on-your-own-box.md +161 -0
  35. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/shadow-scorecard.md +16 -0
  36. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/upgrade.md +49 -0
  37. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/releases/0.3.0.md +1 -5
  38. factorysemantics_mes-0.4.0/docs/releases/0.3.1.md +115 -0
  39. factorysemantics_mes-0.4.0/docs/releases/0.4.0.md +118 -0
  40. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/releases/index.md +3 -1
  41. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/mkdocs.yml +8 -0
  42. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/pyproject.toml +70 -0
  43. factorysemantics_mes-0.4.0/scripts/kill-a-node.sh +264 -0
  44. factorysemantics_mes-0.4.0/skills/assistant/0-how-to-help.md +107 -0
  45. factorysemantics_mes-0.4.0/skills/assistant/1-install.md +199 -0
  46. factorysemantics_mes-0.4.0/skills/assistant/2-your-plant.md +131 -0
  47. factorysemantics_mes-0.4.0/skills/assistant/3-shadow-mode.md +199 -0
  48. factorysemantics_mes-0.4.0/skills/assistant/4-migration.md +102 -0
  49. factorysemantics_mes-0.4.0/skills/assistant/README.md +49 -0
  50. factorysemantics_mes-0.4.0/skills/assistant/SKILL.md +79 -0
  51. factorysemantics_mes-0.4.0/skills/plant-from-your-mes/FORMAT.md +267 -0
  52. factorysemantics_mes-0.4.0/skills/plant-from-your-mes/example/plant-shape-grouped.toml +1227 -0
  53. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/example/plant-shape.toml +69 -26
  54. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/05_assets.sql +5 -1
  55. factorysemantics_mes-0.4.0/skills/plant-from-your-mes/queries/mssql/05d_routings.sql +17 -0
  56. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/05_assets.sql +5 -1
  57. factorysemantics_mes-0.4.0/skills/plant-from-your-mes/queries/sqlite/05d_routings.sql +17 -0
  58. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/scripts/explain.py +58 -4
  59. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/scripts/profile.py +272 -3
  60. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/__init__.py +1 -1
  61. factorysemantics_mes-0.4.0/src/fsmes/__main__.py +21 -0
  62. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/app.py +10 -2
  63. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/system.py +60 -2
  64. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/cli.py +421 -42
  65. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/config.py +59 -0
  66. factorysemantics_mes-0.4.0/src/fsmes/doctor/__init__.py +78 -0
  67. factorysemantics_mes-0.4.0/src/fsmes/doctor/gather.py +696 -0
  68. factorysemantics_mes-0.4.0/src/fsmes/doctor/leak.py +334 -0
  69. factorysemantics_mes-0.4.0/src/fsmes/doctor/render.py +419 -0
  70. factorysemantics_mes-0.4.0/src/fsmes/doctor/scrub.py +833 -0
  71. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/__init__.py +14 -0
  72. factorysemantics_mes-0.4.0/src/fsmes/domain/leases.py +76 -0
  73. factorysemantics_mes-0.4.0/src/fsmes/firstrun.py +259 -0
  74. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/fleet/commands.py +196 -18
  75. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/fleet/console.py +83 -6
  76. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/fleet/owned.py +17 -2
  77. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/identity.py +13 -0
  78. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/scorecard.py +76 -0
  79. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/opc/agent.py +171 -10
  80. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/opc/csv_replay.py +4 -2
  81. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/opc/simulator.py +4 -2
  82. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/opc/tag_map.py +45 -2
  83. factorysemantics_mes-0.4.0/src/fsmes/migration.py +84 -0
  84. factorysemantics_mes-0.4.0/src/fsmes/migrations/versions/b6f0c2a71d58_a_lease_and_a_counter_baseline.py +71 -0
  85. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/modules.py +11 -1
  86. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/check.py +98 -1
  87. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/fleet.py +8 -0
  88. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/format.py +57 -1
  89. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/plant.py +545 -77
  90. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/schema.py +56 -0
  91. factorysemantics_mes-0.4.0/src/fsmes/services/counters.py +69 -0
  92. factorysemantics_mes-0.4.0/src/fsmes/services/leases.py +304 -0
  93. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/shadow.py +12 -1
  94. factorysemantics_mes-0.4.0/src/fsmes/shape/__init__.py +31 -0
  95. factorysemantics_mes-0.4.0/src/fsmes/shape/model.py +725 -0
  96. factorysemantics_mes-0.4.0/src/fsmes/shape/pack.py +581 -0
  97. factorysemantics_mes-0.4.0/src/fsmes/shape/read.py +130 -0
  98. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/operations.py +118 -2
  99. factorysemantics_mes-0.4.0/src/fsmes/skills.py +395 -0
  100. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/standalone.py +103 -4
  101. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/common.js +80 -0
  102. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/fleet.css +11 -0
  103. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/fleet.js +72 -0
  104. factorysemantics_mes-0.4.0/tests/test_a_plant_can_run_as_two_nodes_on_one_box_and_the_fleet_knows_both.py +1033 -0
  105. factorysemantics_mes-0.4.0/tests/test_a_plant_on_two_nodes_survives_one_of_them_dying.py +602 -0
  106. factorysemantics_mes-0.4.0/tests/test_a_plant_records_what_each_of_its_processes_is.py +136 -0
  107. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_plant_shape_built_blind_from_an_unknown_sql_mes_is_the_bottling_line.py +5 -2
  108. factorysemantics_mes-0.4.0/tests/test_a_shift_of_stops_comes_out_in_the_plants_own_proportions.py +89 -0
  109. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_agent_batching.py +22 -1
  110. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_core_purity.py +32 -0
  111. factorysemantics_mes-0.4.0/tests/test_doctor_writes_one_file_with_nothing_of_yours_in_it.py +498 -0
  112. factorysemantics_mes-0.4.0/tests/test_every_command_the_assistant_folder_tells_you_to_run_exists.py +281 -0
  113. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_fleet_create_makes_a_usable_plant.py +67 -0
  114. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_fleet_ownership.py +2 -2
  115. factorysemantics_mes-0.4.0/tests/test_fsmes_runs_as_a_module_when_it_is_not_on_the_path.py +63 -0
  116. factorysemantics_mes-0.4.0/tests/test_no_command_loses_a_word_of_its_help_to_the_painter.py +78 -0
  117. factorysemantics_mes-0.4.0/tests/test_one_reader_at_a_time_is_a_lease_in_the_database.py +440 -0
  118. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_shadow_scorecard.py +97 -1
  119. factorysemantics_mes-0.4.0/tests/test_tags_grouped_the_way_a_real_opc_server_groups_them.py +111 -0
  120. factorysemantics_mes-0.4.0/tests/test_the_dashboard_says_which_node_answered_and_who_reads_the_machines.py +318 -0
  121. factorysemantics_mes-0.4.0/tests/test_the_demo_path_says_what_is_wrong_and_what_to_type.py +247 -0
  122. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_docker_image_carries_the_packs.py +3 -3
  123. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_release_body_github_will_accept.py +47 -4
  124. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_simulated_floor_signs_in_again_when_its_login_runs_out.py +31 -0
  125. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_skills_zip_holds_exactly_what_it_says_and_nothing_else.py +70 -3
  126. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_sql_server_query_set_is_not_sqlite_in_disguise.py +12 -6
  127. factorysemantics_mes-0.4.0/tests/test_the_wheel_ships_the_assistant_folder.py +147 -0
  128. factorysemantics_mes-0.4.0/tests/test_two_plants_from_two_shapes_keep_each_plants_own_shape.py +433 -0
  129. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/unknown_mes.py +108 -12
  130. factorysemantics_mes-0.3.0/docs/operate/plant-from-your-mes.md +0 -174
  131. factorysemantics_mes-0.3.0/skills/plant-from-your-mes/FORMAT.md +0 -125
  132. factorysemantics_mes-0.3.0/src/fsmes/skills.py +0 -120
  133. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.dockerignore +0 -0
  134. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.env.example +0 -0
  135. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/CODEOWNERS +0 -0
  136. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  137. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  138. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/ISSUE_TEMPLATE/integration.yml +0 -0
  139. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/ISSUE_TEMPLATE/plant-pack.yml +0 -0
  140. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  141. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/dependabot.yml +0 -0
  142. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/scripts/demo_from_wheel.sh +0 -0
  143. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/scripts/lab_starters.sh +0 -0
  144. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/scripts/plant_from_wheel.py +0 -0
  145. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/scripts/release_notes.sh +0 -0
  146. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/scripts/upgrade_from_previous_release.sh +0 -0
  147. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/workflows/dco.yml +0 -0
  148. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/workflows/docs.yml +0 -0
  149. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/workflows/erpnext-live.yml +0 -0
  150. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/workflows/scorecard.yml +0 -0
  151. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.github/workflows/welcome.yml +0 -0
  152. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/.gitignore +0 -0
  153. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  154. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/CONTRIBUTING.md +0 -0
  155. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/GOVERNANCE.md +0 -0
  156. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/LICENSE +0 -0
  157. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/MAINTAINERS.md +0 -0
  158. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/NOTICE +0 -0
  159. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/ROADMAP.md +0 -0
  160. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/SECURITY.md +0 -0
  161. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/alembic.ini +0 -0
  162. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/config/inbound_mapping.json +0 -0
  163. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/config/inbound_sql.json +0 -0
  164. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/config/line_layout.json +0 -0
  165. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/config/tag_map.json +0 -0
  166. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/config/tag_map_kepsim.json +0 -0
  167. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/config/tag_map_kepware.json +0 -0
  168. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/deploy/README.md +0 -0
  169. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/deploy/fsmes-autoloop.service +0 -0
  170. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/deploy/fsmes-autoloop.timer +0 -0
  171. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/deploy/fsmes-prod-plant@.service +0 -0
  172. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/deploy/promote.sh +0 -0
  173. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docker/docker-compose.yml +0 -0
  174. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docker/nginx.conf +0 -0
  175. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/LANDSCAPE.md +0 -0
  176. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/agents/connect-mcp-client.md +0 -0
  177. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/agents/evals.md +0 -0
  178. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/agents/index.md +0 -0
  179. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/agents/write-discipline.md +0 -0
  180. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/ASSIST-EVAL.md +0 -0
  181. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/BUDGET.md +0 -0
  182. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/JEV-CALIBRATION.md +0 -0
  183. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/JEV.md +0 -0
  184. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/JUDGMENT-IN-THE-BUILD-LOOP.md +0 -0
  185. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/OBSERVABILITY.md +0 -0
  186. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/assist-eval/2026-09-27-live-admin.md +0 -0
  187. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/assist-eval/2026-09-27-live-operator.md +0 -0
  188. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/assist-eval/2026-09-27-scripted.md +0 -0
  189. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/full/calibration.md +0 -0
  190. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/full/d1-against-truth.json +0 -0
  191. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/full/d1-component-stopped-reporting.svg +0 -0
  192. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/full/d1-counter-went-backwards.svg +0 -0
  193. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/full/p1-by-confidence.svg +0 -0
  194. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/full/p1-by-probability.svg +0 -0
  195. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/stopped-not-why/calibration.md +0 -0
  196. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/stopped-not-why/d1-against-truth.json +0 -0
  197. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/stopped-not-why/d1-component-stopped-reporting.svg +0 -0
  198. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/stopped-not-why/d1-counter-went-backwards.svg +0 -0
  199. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/stopped-not-why/p1-by-confidence.svg +0 -0
  200. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/ai/calibration/2026-09-17/stopped-not-why/p1-by-probability.svg +0 -0
  201. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0001-apache-2-with-dco.md +0 -0
  202. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0002-kernel-and-modules.md +0 -0
  203. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0003-one-mcp-server.md +0 -0
  204. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0004-never-invent-production.md +0 -0
  205. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0005-plain-html-no-build-step.md +0 -0
  206. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0006-sqlite-laptop-postgresql-plant.md +0 -0
  207. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0007-fresh-public-history.md +0 -0
  208. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0008-erp-connectors-are-modules.md +0 -0
  209. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0009-organisation-not-personal-account.md +0 -0
  210. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0010-github-discussions-only.md +0 -0
  211. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0011-mkdocs-material-generated-reference.md +0 -0
  212. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0012-contributor-covenant-3.md +0 -0
  213. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0013-governance-is-one-page.md +0 -0
  214. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0014-first-public-version-is-0-1-0.md +0 -0
  215. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0015-mcp-registry-name.md +0 -0
  216. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0016-no-trademark-registration.md +0 -0
  217. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0017-one-public-demo-gated-and-bounded.md +0 -0
  218. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0018-public-on-2026-09-08-and-the-pre-tag-check.md +0 -0
  219. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0019-count-everything-the-machine-counted.md +0 -0
  220. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0020-what-supported-means-for-an-erp-connector.md +0 -0
  221. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0021-one-database-per-plant.md +0 -0
  222. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0022-what-a-plant-pack-may-contain.md +0 -0
  223. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0023-the-fleet-console-observes.md +0 -0
  224. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0024-a-nonconformance-has-a-life.md +0 -0
  225. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0025-performance-is-measured-not-capped.md +0 -0
  226. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0026-counts-that-outrun-the-run-time.md +0 -0
  227. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0027-an-spc-signal-raises-a-hold.md +0 -0
  228. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0028-which-shift-a-minute-belongs-to.md +0 -0
  229. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0029-an-order-does-not-finish-itself.md +0 -0
  230. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0030-a-lost-connection-is-unknown-time.md +0 -0
  231. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0031-a-judgment-is-a-proposal.md +0 -0
  232. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0032-a-hosted-judgment-and-the-shadow.md +0 -0
  233. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0033-availability-is-a-share-of-what-was-watched.md +0 -0
  234. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0034-a-count-is-owed-until-it-is-booked.md +0 -0
  235. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0035-configuration-is-authored-by-roles-and-selected-by-operators.md +0 -0
  236. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0036-the-chart-draws-every-rule-the-plant-chooses-which-hold.md +0 -0
  237. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0038-an-agent-is-an-account-with-a-role-a-budget-and-a-cadence.md +0 -0
  238. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0039-an-analysis-is-recorded-code-that-can-only-read.md +0 -0
  239. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0040-the-chart-type-follows-the-sampling-plan.md +0 -0
  240. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/0041-a-characteristic-the-plant-counts.md +0 -0
  241. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/decisions/TEMPLATE.md +0 -0
  242. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/STYLE.md +0 -0
  243. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/README.md +0 -0
  244. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/admin-edit-roles.md +0 -0
  245. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/analysis-cards-scaling.md +0 -0
  246. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/assistant-submits-an-inspection.md +0 -0
  247. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/book-output-explicit-order.md +0 -0
  248. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/clickable-kpi-tiles.md +0 -0
  249. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/clickable-machine-breadcrumbs.md +0 -0
  250. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/floor-machines-paginate-and-filter.md +0 -0
  251. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/measurements-card-filtering.md +0 -0
  252. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/measurements-characteristic-filter.md +0 -0
  253. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/nonconformance-lifecycle.md +0 -0
  254. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/opc-integration-suite.md +0 -0
  255. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/order-card-search-finds-a-material.md +0 -0
  256. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/order-lifecycle-actions.md +0 -0
  257. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/orders-creatable-materials.md +0 -0
  258. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/orders-supervisor-filters.md +0 -0
  259. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/persistent-header-menu.md +0 -0
  260. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/review-orders.md +0 -0
  261. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/review-station.md +0 -0
  262. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/scrap-reason-codes.md +0 -0
  263. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/shop-floor-actions-strip.md +0 -0
  264. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/sixty-machine-plant.md +0 -0
  265. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/spc-capability-withheld.md +0 -0
  266. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/specifications-card-filtering.md +0 -0
  267. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/specifications-server-paged.md +0 -0
  268. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/station-quality-card.md +0 -0
  269. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/station-spc.md +0 -0
  270. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/station-view.md +0 -0
  271. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/supervisor-drill-down.md +0 -0
  272. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/backlog/ui-style-drift-bc58fb4f8e4d.md +0 -0
  273. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/config-assistance.md +0 -0
  274. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/config-audit-2026-09-21.md +0 -0
  275. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/deep-analysis.md +0 -0
  276. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/design/m8-packs-and-fleet.md +0 -0
  277. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/develop/erp-connectors.md +0 -0
  278. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/develop/experiments.md +0 -0
  279. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/develop/index.md +0 -0
  280. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/develop/your-first-module.md +0 -0
  281. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/history/private-era.md +0 -0
  282. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/hooks/generate.py +0 -0
  283. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/onboarding/GUIDE-ENGINEERING.md +0 -0
  284. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/onboarding/GUIDE-IT.md +0 -0
  285. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/onboarding/README.md +0 -0
  286. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/onboarding/worksheet-example.csv +0 -0
  287. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/onboarding/worksheet-template.csv +0 -0
  288. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/administration-numbers.md +0 -0
  289. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/ai.md +0 -0
  290. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/assistant-coverage.md +0 -0
  291. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/backup.md +0 -0
  292. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/compatibility.md +0 -0
  293. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/completion-with-a-lot.json +0 -0
  294. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/completion-with-a-lot.xml +0 -0
  295. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/completion-with-an-over-run.json +0 -0
  296. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/completion-with-an-over-run.xml +0 -0
  297. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/completion-without-a-lot.json +0 -0
  298. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/completion-without-a-lot.xml +0 -0
  299. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/operation-clean.json +0 -0
  300. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/operation-clean.xml +0 -0
  301. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/operation-over-run.json +0 -0
  302. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/operation-over-run.xml +0 -0
  303. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/operation-with-scrap-and-components.json +0 -0
  304. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-examples/operation-with-scrap-and-components.xml +0 -0
  305. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/confirmation-files.md +0 -0
  306. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/coverage.md +0 -0
  307. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/engineering-numbers.md +0 -0
  308. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/erp-settings.md +0 -0
  309. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/erpnext.md +0 -0
  310. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/first-week.md +0 -0
  311. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/images/review-walk-station.png +0 -0
  312. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/images/review-walkthrough.png +0 -0
  313. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/inbound.md +0 -0
  314. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/modules.md +0 -0
  315. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/opc-disconnections.md +0 -0
  316. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/opc-readonly.md +0 -0
  317. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/quality-numbers.md +0 -0
  318. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/quality-severities.md +0 -0
  319. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/registry.md +0 -0
  320. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/releasing.md +0 -0
  321. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/security.md +0 -0
  322. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/shadow-mode.md +0 -0
  323. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/the-simulated-floor.md +0 -0
  324. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/tls.md +0 -0
  325. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/uns.md +0 -0
  326. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/operate/who-names-the-reasons.md +0 -0
  327. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/plant/first-line.md +0 -0
  328. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/plant/images/spc-xbar-and-r.png +0 -0
  329. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/plant/index.md +0 -0
  330. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/plant/never-invent-production.md +0 -0
  331. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/plant/quality-signals.md +0 -0
  332. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/plant/reading-a-trend.md +0 -0
  333. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/plant/reading-oee.md +0 -0
  334. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/plant/shifts.md +0 -0
  335. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/docs/releases/0.2.0.md +0 -0
  336. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/README.md +0 -0
  337. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/analysis/build_notebook.py +0 -0
  338. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/analysis/build_report.py +0 -0
  339. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/analysis/cutlery_run_analysis.ipynb +0 -0
  340. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/analysis/viz.py +0 -0
  341. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/build_config.py +0 -0
  342. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/fill_day.py +0 -0
  343. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/fleet.toml +0 -0
  344. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/init.py +0 -0
  345. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/line.json +0 -0
  346. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/make_tag_map.py +0 -0
  347. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/masterdata/downtime_reasons.json +0 -0
  348. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/masterdata/nc_severities.json +0 -0
  349. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/plant.toml +0 -0
  350. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/run_cutlery.py +0 -0
  351. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/tag_map.json +0 -0
  352. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/walkthroughs/install_walkthroughs.py +0 -0
  353. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/cutlery/walkthroughs/walkthroughs.json +0 -0
  354. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/erpnext/VERSIONS.md +0 -0
  355. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/erpnext/docker-compose.yml +0 -0
  356. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/erpnext/seed_erpnext.py +0 -0
  357. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/experiments/lost-connection.toml +0 -0
  358. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/experiments/one-line-bad-hour.toml +0 -0
  359. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/experiments/over-run.toml +0 -0
  360. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/experiments/scrap-burst.toml +0 -0
  361. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/experiments/starved-and-blocked.toml +0 -0
  362. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/experiments/two-plants-two-zones.toml +0 -0
  363. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/kepsim/.env.example +0 -0
  364. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/kepsim/README.md +0 -0
  365. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/kepsim/kepware_setup.py +0 -0
  366. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/kepsim/line.json +0 -0
  367. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/kepsim/scenario.md +0 -0
  368. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/kepsim/setup_dsn.ps1 +0 -0
  369. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/kepsim/verify_readback.py +0 -0
  370. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/build_config.py +0 -0
  371. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/fleet.toml +0 -0
  372. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/full/build_config.py +0 -0
  373. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/full/init.py +0 -0
  374. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/full/line.json +0 -0
  375. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/full/plant.toml +0 -0
  376. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/full/run_full.py +0 -0
  377. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/full/seed_breadth.py +0 -0
  378. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/full/surfaces.py +0 -0
  379. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/full/tag_map.json +0 -0
  380. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/init.py +0 -0
  381. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/line.json +0 -0
  382. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/make_tag_map.py +0 -0
  383. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/run_spike.py +0 -0
  384. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/seed_breadth.py +0 -0
  385. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/megafactory/tag_map.json +0 -0
  386. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/README.md +0 -0
  387. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/floor.json +0 -0
  388. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/line.json +0 -0
  389. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/README.md +0 -0
  390. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/bom.json +0 -0
  391. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/dispatch_rules.json +0 -0
  392. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/downtime_reasons.json +0 -0
  393. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/equipment.json +0 -0
  394. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/gauges.json +0 -0
  395. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/lots.json +0 -0
  396. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/maintenance_plans.json +0 -0
  397. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/materials.json +0 -0
  398. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/nc_severities.json +0 -0
  399. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/personnel.json +0 -0
  400. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/personnel_skills.json +0 -0
  401. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/quality_specs.json +0 -0
  402. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/roster.json +0 -0
  403. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/routings.json +0 -0
  404. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/shifts.json +0 -0
  405. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/skills.json +0 -0
  406. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/masterdata/work_orders.json +0 -0
  407. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/plant.toml +0 -0
  408. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/bottling/tag_map.json +0 -0
  409. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/README.md +0 -0
  410. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/floor.json +0 -0
  411. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/mappings/inbound_mapping.json +0 -0
  412. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/masterdata/downtime_reasons.json +0 -0
  413. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/masterdata/equipment.json +0 -0
  414. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/masterdata/lots.json +0 -0
  415. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/masterdata/materials.json +0 -0
  416. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/masterdata/nc_severities.json +0 -0
  417. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/masterdata/quality_specs.json +0 -0
  418. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/masterdata/routings.json +0 -0
  419. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/masterdata/work_orders.json +0 -0
  420. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/plant.toml +0 -0
  421. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/finewire/tag_map.json +0 -0
  422. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/fleet.toml +0 -0
  423. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/floor.json +0 -0
  424. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/line.json +0 -0
  425. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/README.md +0 -0
  426. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/downtime_reasons.json +0 -0
  427. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/equipment.json +0 -0
  428. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/lots.json +0 -0
  429. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/materials.json +0 -0
  430. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/nc_severities.json +0 -0
  431. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/quality_specs.json +0 -0
  432. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/routings.json +0 -0
  433. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/masterdata/work_orders.json +0 -0
  434. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/plant.toml +0 -0
  435. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/labs/multiplant/machining/tag_map.json +0 -0
  436. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/SKILL.md +0 -0
  437. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/01_inventory.sql +0 -0
  438. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/01b_row_count.sql +0 -0
  439. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/02_columns.sql +0 -0
  440. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/03_window.sql +0 -0
  441. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/04_column_profile.sql +0 -0
  442. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/04b_column_sample.sql +0 -0
  443. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/05b_tag_samples.sql +0 -0
  444. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/05c_tag_samples_nostate.sql +0 -0
  445. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/06_states.sql +0 -0
  446. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/06b_production.sql +0 -0
  447. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/06c_quality.sql +0 -0
  448. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/06d_orders.sql +0 -0
  449. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/06e_shifts.sql +0 -0
  450. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/06f_documents.sql +0 -0
  451. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/mssql/07_erp.sql +0 -0
  452. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/01_inventory.sql +0 -0
  453. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/01b_row_count.sql +0 -0
  454. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/02_columns.sql +0 -0
  455. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/03_window.sql +0 -0
  456. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/04_column_profile.sql +0 -0
  457. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/04b_column_sample.sql +0 -0
  458. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/05b_tag_samples.sql +0 -0
  459. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/05c_tag_samples_nostate.sql +0 -0
  460. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/06_states.sql +0 -0
  461. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/06b_production.sql +0 -0
  462. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/06c_quality.sql +0 -0
  463. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/06d_orders.sql +0 -0
  464. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/06e_shifts.sql +0 -0
  465. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/06f_documents.sql +0 -0
  466. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/queries/sqlite/07_erp.sql +0 -0
  467. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/skills/plant-from-your-mes/scripts/leakcheck.py +0 -0
  468. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/__init__.py +0 -0
  469. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/deps.py +0 -0
  470. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/idempotency.py +0 -0
  471. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/paging.py +0 -0
  472. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/__init__.py +0 -0
  473. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/adjustments.py +0 -0
  474. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/admin.py +0 -0
  475. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/analysis.py +0 -0
  476. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/assist.py +0 -0
  477. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/auth.py +0 -0
  478. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/coa.py +0 -0
  479. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/dashboard.py +0 -0
  480. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/design.py +0 -0
  481. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/documents.py +0 -0
  482. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/equipment.py +0 -0
  483. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/erp.py +0 -0
  484. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/execution.py +0 -0
  485. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/kpis.py +0 -0
  486. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/line.py +0 -0
  487. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/maintenance.py +0 -0
  488. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/masterdata.py +0 -0
  489. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/ops.py +0 -0
  490. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/quality.py +0 -0
  491. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/reasons.py +0 -0
  492. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/scheduling.py +0 -0
  493. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/serialization.py +0 -0
  494. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/severities.py +0 -0
  495. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/triggers.py +0 -0
  496. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/api/routers/workorders.py +0 -0
  497. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/assist_coverage.py +0 -0
  498. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/backup.py +0 -0
  499. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/core/__init__.py +0 -0
  500. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/core/oplock.py +0 -0
  501. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/db.py +0 -0
  502. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/demo_feed.py +0 -0
  503. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/adjustments.py +0 -0
  504. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/ai_turns.py +0 -0
  505. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/audit.py +0 -0
  506. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/calendar.py +0 -0
  507. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/common.py +0 -0
  508. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/crew.py +0 -0
  509. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/documents.py +0 -0
  510. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/equipment.py +0 -0
  511. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/execution.py +0 -0
  512. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/gauges.py +0 -0
  513. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/idempotency.py +0 -0
  514. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/inbound.py +0 -0
  515. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/integration.py +0 -0
  516. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/maintenance.py +0 -0
  517. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/masterdata.py +0 -0
  518. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/plant_settings.py +0 -0
  519. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/quality.py +0 -0
  520. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/reasons.py +0 -0
  521. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/scheduling.py +0 -0
  522. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/serialization.py +0 -0
  523. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/severities.py +0 -0
  524. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/timeseries.py +0 -0
  525. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/triggers.py +0 -0
  526. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/uns.py +0 -0
  527. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/domain/workorders.py +0 -0
  528. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/fleet/__init__.py +0 -0
  529. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/fleet/logsink.py +0 -0
  530. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/fleet/observe.py +0 -0
  531. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/__init__.py +0 -0
  532. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/__init__.py +0 -0
  533. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/b2mml.py +0 -0
  534. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/base.py +0 -0
  535. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/conformance.py +0 -0
  536. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/contract.py +0 -0
  537. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/erpnext_adapter.py +0 -0
  538. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/erpnext_setup.py +0 -0
  539. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/examples.py +0 -0
  540. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/file_adapter.py +0 -0
  541. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/incumbent.py +0 -0
  542. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/mock_erp.py +0 -0
  543. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/rest_adapter.py +0 -0
  544. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/schema.py +0 -0
  545. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/scorecard_html.py +0 -0
  546. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/sync.py +0 -0
  547. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/erp/validate.py +0 -0
  548. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/events.py +0 -0
  549. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/inbound/__init__.py +0 -0
  550. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/inbound/contract.py +0 -0
  551. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/inbound/folder.py +0 -0
  552. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/inbound/mqtt.py +0 -0
  553. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/inbound/sql.py +0 -0
  554. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/jev/__init__.py +0 -0
  555. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/jev/client.py +0 -0
  556. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/jev/transport.py +0 -0
  557. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/opc/__init__.py +0 -0
  558. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/opc/inspect.py +0 -0
  559. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/opc/security.py +0 -0
  560. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/opc/worksheet.py +0 -0
  561. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/uns/__init__.py +0 -0
  562. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/uns/envelope.py +0 -0
  563. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/uns/publisher.py +0 -0
  564. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/uns/topics.py +0 -0
  565. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/integrations/uns/transport.py +0 -0
  566. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/kernel/__init__.py +0 -0
  567. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/kernel/common.py +0 -0
  568. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/kernel/tags.py +0 -0
  569. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/__init__.py +0 -0
  570. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/assist_eval.py +0 -0
  571. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/assist_fixtures.py +0 -0
  572. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/assist_seed.py +0 -0
  573. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/build.py +0 -0
  574. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/console.py +0 -0
  575. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/feedback.py +0 -0
  576. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/measure.py +0 -0
  577. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/observe.py +0 -0
  578. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/plan.py +0 -0
  579. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/report.py +0 -0
  580. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/review.py +0 -0
  581. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/run.py +0 -0
  582. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/lab/truth.py +0 -0
  583. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/logging.py +0 -0
  584. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/__init__.py +0 -0
  585. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/adjustments.py +0 -0
  586. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/analysis.py +0 -0
  587. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/coa.py +0 -0
  588. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/equipment.py +0 -0
  589. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/erp.py +0 -0
  590. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/maintenance.py +0 -0
  591. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/masterdata.py +0 -0
  592. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/quality.py +0 -0
  593. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/reasons.py +0 -0
  594. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/scheduling.py +0 -0
  595. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/serialization.py +0 -0
  596. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/settings.py +0 -0
  597. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/severities.py +0 -0
  598. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp/triggers.py +0 -0
  599. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/mcp_server.py +0 -0
  600. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/env.py +0 -0
  601. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/script.py.mako +0 -0
  602. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/153379d6cf19_merge_cutlery_and_walkthrough_chains.py +0 -0
  603. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/18af853fc5c4_initial_schema.py +0 -0
  604. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/7c1e5a9d2b4f_serial_sequences.py +0 -0
  605. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/9c4d2c836d05_add_user_passwords.py +0 -0
  606. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a1b2c3d4e5f6_agent_identity.py +0 -0
  607. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a1c47f8b2d93_what_a_maintenance_job_needs_of_the_line.py +0 -0
  608. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a1c5e70b2d94_plant_settings.py +0 -0
  609. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a1c5e83b7602_calendar_and_scheduling.py +0 -0
  610. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a3f6c81d09e2_unassigned_production.py +0 -0
  611. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a4d9c2e70f18_uns_publications.py +0 -0
  612. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a7c1e93b5f20_roles_as_data.py +0 -0
  613. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a7c2e5d1b9f0_document_kind_steps_needs_walkthroughs.py +0 -0
  614. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/a9c4e17b3d60_spc_signals_act.py +0 -0
  615. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b1f4c73a9e08_nonconformance_lifecycle.py +0 -0
  616. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b1f4c7a2e903_production_logs_equipment_ts_index.py +0 -0
  617. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b2c3d4e5f6a7_outbox_hardening.py +0 -0
  618. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b3f8d2a41c67_controlled_documents.py +0 -0
  619. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b3f9c07e51ad_ai_turns.py +0 -0
  620. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b5c1d09e73af_inbound_events_and_their_source.py +0 -0
  621. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b7d2e9f4a1c3_unit_inspections.py +0 -0
  622. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b8f4d27e1a53_serialisation.py +0 -0
  623. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/b9f31c7a4e50_a_characteristic_inspected_n_at_a_time.py +0 -0
  624. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c1e7a04b93d5_downtime_reasons.py +0 -0
  625. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c2e9b74a3f81_gauges_and_calibration.py +0 -0
  626. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c3d4e5f6a7b8_triggers.py +0 -0
  627. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c3d7e91a4b28_equipment_connections.py +0 -0
  628. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c4e8f1a2d5b6_serial_units_one_index.py +0 -0
  629. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c6a4b81f39d7_shift_attribution.py +0 -0
  630. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c7a2e94b16d3_five_facts_the_plant_was_dropping.py +0 -0
  631. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c8b1e40d7a92_erp_messages_direction_index.py +0 -0
  632. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/c9e2a4b71d38_material_at_a_station.py +0 -0
  633. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/d2b7e51c9a04_nc_severities.py +0 -0
  634. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/d4a1c7e5b902_equipment_cost_center.py +0 -0
  635. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/d4a7f10c8b52_component_may_enter_twice.py +0 -0
  636. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/d4e5f6a7b8c9_recommended_adjustments.py +0 -0
  637. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/d4e8a1c93b70_a_characteristic_the_plant_counts.py +0 -0
  638. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/d7b4e92a1c58_the_maintenance_crew_and_its_rules.py +0 -0
  639. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/d9a3f61c48e0_inbound_sql_watermarks.py +0 -0
  640. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/e3c8a17d5b46_gauge_warning_and_pieces.py +0 -0
  641. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/e5f6a7b8c9d0_tag_values_latest_index.py +0 -0
  642. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/e6b3c92d4f17_drop_the_old_bom_constraint.py +0 -0
  643. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/e7b3c9d18a45_workorder_work_center.py +0 -0
  644. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/f0a1b2c3d4e5_equipment_states_ended_index.py +0 -0
  645. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/f2a8d31c6b74_routing_durations.py +0 -0
  646. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/migrations/versions/f7d1a58e2c94_preventive_maintenance.py +0 -0
  647. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/__init__.py +0 -0
  648. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/apply.py +0 -0
  649. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/masterdata.py +0 -0
  650. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/migrate.py +0 -0
  651. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/plan.py +0 -0
  652. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/pack/repoint.py +0 -0
  653. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/py.typed +0 -0
  654. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/seed.py +0 -0
  655. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/seed_kepsim.py +0 -0
  656. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/seed_line.py +0 -0
  657. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/__init__.py +0 -0
  658. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/adjustments.py +0 -0
  659. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/agent.py +0 -0
  660. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/ai_status.py +0 -0
  661. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/ai_trace.py +0 -0
  662. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/analysis.py +0 -0
  663. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/assist_eval.py +0 -0
  664. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/assistant.py +0 -0
  665. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/audit.py +0 -0
  666. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/auth.py +0 -0
  667. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/calendar.py +0 -0
  668. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/capabilities.py +0 -0
  669. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/coa.py +0 -0
  670. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/connection.py +0 -0
  671. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/coverage.py +0 -0
  672. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/design.py +0 -0
  673. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/design_triage.py +0 -0
  674. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/dispatch.py +0 -0
  675. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/documents.py +0 -0
  676. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/drafting.py +0 -0
  677. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/equipment.py +0 -0
  678. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/erp.py +0 -0
  679. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/execution.py +0 -0
  680. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/gauges.py +0 -0
  681. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/inbound.py +0 -0
  682. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/line.py +0 -0
  683. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/line_clock.py +0 -0
  684. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/maintenance.py +0 -0
  685. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/masterdata.py +0 -0
  686. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/moment.py +0 -0
  687. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/oee.py +0 -0
  688. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/outbox.py +0 -0
  689. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/plant_settings.py +0 -0
  690. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/quality.py +0 -0
  691. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/reasons.py +0 -0
  692. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/retention.py +0 -0
  693. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/review.py +0 -0
  694. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/scheduling.py +0 -0
  695. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/serialization.py +0 -0
  696. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/severities.py +0 -0
  697. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/spc.py +0 -0
  698. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/spc_point.py +0 -0
  699. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/staging.py +0 -0
  700. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/state_block.py +0 -0
  701. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/tags.py +0 -0
  702. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/trace_analysis.py +0 -0
  703. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/trend.py +0 -0
  704. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/triggers.py +0 -0
  705. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/uns.py +0 -0
  706. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/vocabulary.py +0 -0
  707. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/walkthroughs.py +0 -0
  708. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/services/workorders.py +0 -0
  709. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/__init__.py +0 -0
  710. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/agent_eval.py +0 -0
  711. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/autoloop.py +0 -0
  712. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/calibration.py +0 -0
  713. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/config_audit.py +0 -0
  714. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/config_audit_curated.py +0 -0
  715. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/generate.py +0 -0
  716. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/labelled.py +0 -0
  717. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/mcp_server.py +0 -0
  718. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/measurement.py +0 -0
  719. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/rollup.py +0 -0
  720. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/runner.py +0 -0
  721. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/score.py +0 -0
  722. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/store.py +0 -0
  723. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/sweep.py +0 -0
  724. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/triage.py +0 -0
  725. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/truth.py +0 -0
  726. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/sim/ui_check.py +0 -0
  727. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/storage.py +0 -0
  728. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/adjustments.html +0 -0
  729. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/adjustments.js +0 -0
  730. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/admin.css +0 -0
  731. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/admin.html +0 -0
  732. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/admin.js +0 -0
  733. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/ai.css +0 -0
  734. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/ai.html +0 -0
  735. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/ai.js +0 -0
  736. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/analysis.css +0 -0
  737. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/analysis.html +0 -0
  738. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/analysis.js +0 -0
  739. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/app.js +0 -0
  740. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/assist-record.js +0 -0
  741. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/assist.css +0 -0
  742. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/assist.js +0 -0
  743. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/coa.css +0 -0
  744. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/coa.html +0 -0
  745. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/coa.js +0 -0
  746. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/config.html +0 -0
  747. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/config.js +0 -0
  748. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/demo/kepsim-hour.json +0 -0
  749. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/design.css +0 -0
  750. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/design.js +0 -0
  751. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/fleet.html +0 -0
  752. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/gauges.html +0 -0
  753. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/gauges.js +0 -0
  754. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/index.html +0 -0
  755. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/instructions.css +0 -0
  756. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/instructions.html +0 -0
  757. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/instructions.js +0 -0
  758. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/kit.js +0 -0
  759. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line/app.js +0 -0
  760. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line/feed.js +0 -0
  761. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line/flow.js +0 -0
  762. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line/parts.js +0 -0
  763. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line/robot.js +0 -0
  764. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line/scene.js +0 -0
  765. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line-page.js +0 -0
  766. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line.css +0 -0
  767. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line.html +0 -0
  768. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/line3d.html +0 -0
  769. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/machine.css +0 -0
  770. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/machine.html +0 -0
  771. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/machine.js +0 -0
  772. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/machines.html +0 -0
  773. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/machines.js +0 -0
  774. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/maintenance.css +0 -0
  775. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/maintenance.html +0 -0
  776. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/maintenance.js +0 -0
  777. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/masterdata.html +0 -0
  778. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/masterdata.js +0 -0
  779. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/ops.css +0 -0
  780. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/ops.html +0 -0
  781. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/ops.js +0 -0
  782. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/orders.css +0 -0
  783. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/orders.html +0 -0
  784. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/orders.js +0 -0
  785. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/quality.css +0 -0
  786. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/quality.html +0 -0
  787. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/quality.js +0 -0
  788. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/reasons.html +0 -0
  789. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/reasons.js +0 -0
  790. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/schedule.html +0 -0
  791. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/schedule.js +0 -0
  792. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/severities.html +0 -0
  793. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/severities.js +0 -0
  794. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/spc.css +0 -0
  795. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/spc.html +0 -0
  796. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/spc.js +0 -0
  797. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/station.css +0 -0
  798. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/station.html +0 -0
  799. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/station.js +0 -0
  800. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/styles.css +0 -0
  801. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/tags.html +0 -0
  802. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/tags.js +0 -0
  803. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/themes.css +0 -0
  804. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/themes.js +0 -0
  805. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/trace.html +0 -0
  806. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/trace.js +0 -0
  807. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/triggers.html +0 -0
  808. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/triggers.js +0 -0
  809. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/vendor/OrbitControls.js +0 -0
  810. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/vendor/README.md +0 -0
  811. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/vendor/three.core.min.js +0 -0
  812. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/src/fsmes/web/vendor/three.module.min.js +0 -0
  813. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/assist_suite/README.md +0 -0
  814. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/assist_suite/admin.toml +0 -0
  815. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/assist_suite/agent.toml +0 -0
  816. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/assist_suite/analyst.toml +0 -0
  817. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/assist_suite/operator.toml +0 -0
  818. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/assist_suite/supervisor.toml +0 -0
  819. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/conftest.py +0 -0
  820. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/line/bench.json +0 -0
  821. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/packs/bench/tag_map.json +0 -0
  822. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/recorded/bench-scorecard.json +0 -0
  823. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/replay/bench/Line.csv +0 -0
  824. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/replay/bench/Pack.csv +0 -0
  825. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/replay/bench/Press.csv +0 -0
  826. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/replay/bench/Trim.csv +0 -0
  827. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/replay/bench/Weld.csv +0 -0
  828. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/replay/bench/schema.ini +0 -0
  829. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-run/scores.json +0 -0
  830. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/fixtures/labelled-set.json +0 -0
  831. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/live_replies.py +0 -0
  832. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/page_anchors.py +0 -0
  833. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_block_on_the_state_timeline_carries_the_records_behind_it.py +0 -0
  834. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_characteristic_inspected_five_at_a_time.py +0 -0
  835. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_characteristic_the_plant_counts.py +0 -0
  836. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_chart_draws_only_what_the_api_measured.py +0 -0
  837. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_plant_books_while_its_dashboard_is_read.py +0 -0
  838. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_plant_from_the_package_writes_only_to_a_users_own_directory.py +0 -0
  839. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_plant_logs_at_a_rate_a_year_can_stand.py +0 -0
  840. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_plant_starts_and_stops_the_same_way_on_windows.py +0 -0
  841. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_point_on_the_control_chart_carries_the_records_behind_it.py +0 -0
  842. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_refusal_names_the_capability_and_who_holds_it.py +0 -0
  843. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_sample_on_the_control_chart_carries_the_five_bottles_behind_it.py +0 -0
  844. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_signature_they_hold_is_a_walk_and_not_a_refusal.py +0 -0
  845. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_a_walk_waits_for_a_control_the_page_is_still_drawing.py +0 -0
  846. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_adjustments.py +0 -0
  847. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_agent.py +0 -0
  848. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_agent_eval.py +0 -0
  849. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_ai_status.py +0 -0
  850. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_an_analysis_counts_people_before_it_names_one.py +0 -0
  851. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_an_exploration_draws_what_the_plant_measured.py +0 -0
  852. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_analysis.py +0 -0
  853. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_api.py +0 -0
  854. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_approval_review.py +0 -0
  855. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_assist_suite_scripted.py +0 -0
  856. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_assistant.py +0 -0
  857. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_auth.py +0 -0
  858. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_autoloop.py +0 -0
  859. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_backup.py +0 -0
  860. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_bottling_pack.py +0 -0
  861. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_capabilities.py +0 -0
  862. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_cli.py +0 -0
  863. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_clicking_a_block_on_the_state_timeline_opens_the_records_behind_it.py +0 -0
  864. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_clicking_a_lot_on_the_spc_chart_opens_which_defects.py +0 -0
  865. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_clicking_a_point_on_the_spc_chart_opens_the_records_behind_it.py +0 -0
  866. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_clicking_a_point_on_the_trend_graph_opens_the_records_behind_it.py +0 -0
  867. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_clicking_a_sample_on_the_spc_chart_opens_the_five_bottles.py +0 -0
  868. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_coa.py +0 -0
  869. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_config_audit.py +0 -0
  870. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_configuration_sections.py +0 -0
  871. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_core_oplock.py +0 -0
  872. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_coverage_ledger.py +0 -0
  873. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_cutlery.py +0 -0
  874. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_demo_verdict.py +0 -0
  875. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_design.py +0 -0
  876. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_design_triage.py +0 -0
  877. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_documents.py +0 -0
  878. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_downtime_reasons.py +0 -0
  879. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_environments.py +0 -0
  880. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_equipment_oee.py +0 -0
  881. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_erp_confirmation_files.py +0 -0
  882. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_erp_conformance.py +0 -0
  883. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_erp_contract.py +0 -0
  884. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_erp_roundtrip.py +0 -0
  885. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_erpnext.py +0 -0
  886. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_erpnext_live.py +0 -0
  887. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_every_browser_test_is_in_the_browser_tier.py +0 -0
  888. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_every_settings_list_fits_in_one_tool_result.py +0 -0
  889. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_every_show_me_lands_on_the_real_control.py +0 -0
  890. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_every_write_route_has_a_tool_or_a_reason.py +0 -0
  891. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_every_write_tool_names_the_capability_its_route_demands.py +0 -0
  892. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_everything_the_model_said_in_one_turn_reaches_the_reply.py +0 -0
  893. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_execution.py +0 -0
  894. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_file_erp.py +0 -0
  895. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_fleet_console.py +0 -0
  896. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_fleet_plan.py +0 -0
  897. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_hierarchy.py +0 -0
  898. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_hold.py +0 -0
  899. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_inbound.py +0 -0
  900. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_inbound_folder.py +0 -0
  901. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_inbound_mqtt.py +0 -0
  902. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_inbound_sql.py +0 -0
  903. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_jev_agent_eval_scoring.py +0 -0
  904. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_jev_calibration.py +0 -0
  905. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_jev_fail_safe.py +0 -0
  906. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_jev_labelled_set.py +0 -0
  907. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_jev_run_log_triage.py +0 -0
  908. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_jev_sdk_surface.py +0 -0
  909. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_kepsim.py +0 -0
  910. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_kernel_common.py +0 -0
  911. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_kpi_budget.py +0 -0
  912. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_lab_connection.py +0 -0
  913. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_lab_console.py +0 -0
  914. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_lab_experiments.py +0 -0
  915. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_lab_feedback.py +0 -0
  916. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_lab_latency.py +0 -0
  917. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_lab_order_book.py +0 -0
  918. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_lab_orders.py +0 -0
  919. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_lab_scenarios.py +0 -0
  920. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_line_api.py +0 -0
  921. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_line_scoping.py +0 -0
  922. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_live_admin_settings.py +0 -0
  923. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_live_engineering_settings.py +0 -0
  924. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_live_plant_settings.py +0 -0
  925. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_maintenance.py +0 -0
  926. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_maintenance_work_goes_to_the_right_trade.py +0 -0
  927. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_mcp_product.py +0 -0
  928. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_megafactory.py +0 -0
  929. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_migrations_have_one_head.py +0 -0
  930. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_module_wall.py +0 -0
  931. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_nc_severities.py +0 -0
  932. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_no_tenant_literals.py +0 -0
  933. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_onboarding.py +0 -0
  934. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_opc_disconnection.py +0 -0
  935. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_outbox_events.py +0 -0
  936. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_overproduction.py +0 -0
  937. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_pack_format.py +0 -0
  938. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_pack_third.py +0 -0
  939. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_packaged_config.py +0 -0
  940. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_paging.py +0 -0
  941. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_performance_at_replay_speed.py +0 -0
  942. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_plant_identity.py +0 -0
  943. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_plant_migrate.py +0 -0
  944. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_plant_scale_lists.py +0 -0
  945. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_plant_scale_ui.py +0 -0
  946. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_plant_serve_only.py +0 -0
  947. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_promote_script.py +0 -0
  948. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_quality.py +0 -0
  949. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_quality_numbers.py +0 -0
  950. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_read_never_waits.py +0 -0
  951. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_rollup.py +0 -0
  952. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_route_coverage.py +0 -0
  953. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_routing_depth.py +0 -0
  954. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_run_ports.py +0 -0
  955. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_scale.py +0 -0
  956. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_scheduling_trace.py +0 -0
  957. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_schema_upgrade.py +0 -0
  958. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_serial_scale.py +0 -0
  959. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_shadow_mode.py +0 -0
  960. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_shift_attribution.py +0 -0
  961. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_sim.py +0 -0
  962. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_spc_gauges.py +0 -0
  963. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_spc_moving_range.py +0 -0
  964. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_spc_signals.py +0 -0
  965. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_sqlite_write_locks.py +0 -0
  966. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_status_names_its_database.py +0 -0
  967. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_store.py +0 -0
  968. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_supply_chain_settings.py +0 -0
  969. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_sweep_replay.py +0 -0
  970. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_tag_fabric.py +0 -0
  971. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_tag_fabric_review.py +0 -0
  972. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_tags.py +0 -0
  973. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_ai_screen_shows_a_conversation_and_gates_itself.py +0 -0
  974. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_ai_tab_explores_and_draws_what_it_read.py +0 -0
  975. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_ai_tab_says_what_the_assistant_costs_without_local_ai.py +0 -0
  976. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_analyses_answer_an_agent_the_way_they_answer_a_screen.py +0 -0
  977. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_analysis_agent_is_a_kind_of_its_own.py +0 -0
  978. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_analysis_agent_is_asked_for_the_next_questions.py +0 -0
  979. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_assistant_proposes_rather_than_asking.py +0 -0
  980. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_assistant_reads_before_it_says_no.py +0 -0
  981. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_bottling_shift_leaves_a_chain_a_person_can_walk_back.py +0 -0
  982. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_calendar_tool_names_every_kind_its_api_accepts.py +0 -0
  983. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_chart_comes_into_the_chat_and_stays_clickable.py +0 -0
  984. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_chat_can_open_the_dossier_behind_a_charted_point.py +0 -0
  985. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_control_chart_the_chat_reads_leaves_the_bottles_out.py +0 -0
  986. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_conversation_is_cached_and_not_only_the_catalogue.py +0 -0
  987. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_dispatcher_at_three_hundred_people.py +0 -0
  988. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_gauges_screen_shows_the_two_scales_and_when_each_was_calibrated.py +0 -0
  989. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_panel_can_ask_the_other_agent.py +0 -0
  990. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_panel_keeps_one_brain_through_a_failed_turn.py +0 -0
  991. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_plant_keeps_a_trace_of_what_its_ai_did.py +0 -0
  992. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_plant_stops_dropping_five_facts_it_already_had.py +0 -0
  993. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_screens_that_show_a_characteristic_inspected_five_at_a_time.py +0 -0
  994. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_simulated_crew_does_the_work_it_was_given.py +0 -0
  995. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_simulated_floor_plants_causes_an_engineer_can_find.py +0 -0
  996. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_spc_chart_wears_the_accepted_chart_look.py +0 -0
  997. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_station_redraws_only_what_changed.py +0 -0
  998. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_station_says_when_no_order_is_open_on_the_plant.py +0 -0
  999. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_suite_knows_its_database.py +0 -0
  1000. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_supervisor_writes_a_rule_as_a_sentence.py +0 -0
  1001. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_supervisors_screen_reads_the_shift_and_writes_a_rule.py +0 -0
  1002. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_trend_graph_walks_link_three_of_the_chain.py +0 -0
  1003. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_the_wheel_ships_the_lab_packs.py +0 -0
  1004. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_themes.py +0 -0
  1005. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_triage.py +0 -0
  1006. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_triggers.py +0 -0
  1007. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_two_tags_on_one_axis_and_the_records_behind_a_point.py +0 -0
  1008. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_ui_check.py +0 -0
  1009. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_ui_lists_filter_at_scale.py +0 -0
  1010. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_ui_nav.py +0 -0
  1011. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_ui_oee_above_rated.py +0 -0
  1012. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_uns.py +0 -0
  1013. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_walkthroughs.py +0 -0
  1014. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_washer_story.py +0 -0
  1015. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_web.py +0 -0
  1016. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_what_a_maintenance_job_needs_of_the_line.py +0 -0
  1017. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_wip.py +0 -0
  1018. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/test_workorders.py +0 -0
  1019. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/ui/baselines/control-room.json +0 -0
  1020. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/ui/baselines/daylight.json +0 -0
  1021. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/ui/baselines/high-contrast.json +0 -0
  1022. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/tests/ui/baselines/night-shift.json +0 -0
  1023. {factorysemantics_mes-0.3.0 → factorysemantics_mes-0.4.0}/uv.lock +0 -0
@@ -0,0 +1,186 @@
1
+ #!/usr/bin/env python3
2
+ """Prove the assistant folder comes out of a built wheel, offline, on Linux and
3
+ on Windows.
4
+
5
+ This is the first line of the assistant handoff's definition of done, checked
6
+ the way a person would check it:
7
+
8
+ 1. `pipx install factorysemantics-mes` on a PC that may reach the internet
9
+ once and never again - here, a fresh virtual environment with the wheel in
10
+ it and the network off afterwards;
11
+ 2. `fsmes skills list` names `assistant`, and says the folder came out of the
12
+ installation rather than out of a checkout lying above the working
13
+ directory;
14
+ 3. `fsmes skills unpack assistant ./x` writes the seven markdown pages **and**
15
+ `plant-from-your-mes/` inside them, every file byte-for-byte the
16
+ checkout's;
17
+ 4. nothing in what it wrote is a symlink, and the repository has no second
18
+ copy of the nested folder. That pair is the whole reason `INCLUDES` exists:
19
+ one copy in git, nested at build and unpack time, and a zip of a symlink
20
+ unpacks on Windows as a text file with a path in it.
21
+
22
+ Windows as well as Linux because the first person to install this was on
23
+ Windows, and because a path separator is the kind of thing that only breaks
24
+ there.
25
+
26
+ `plant_from_shape.py` beside this already builds the two virtual environments
27
+ and turns the network off; this imports those helpers rather than keeping a
28
+ second copy of them, for the same reason the skill folder has one copy.
29
+
30
+ Usage: python .github/scripts/assistant_folder_from_the_wheel.py --wheel dist/<name>.whl
31
+ """
32
+
33
+ from __future__ import annotations
34
+
35
+ import argparse
36
+ import filecmp
37
+ import os
38
+ import subprocess
39
+ import sys
40
+ import tempfile
41
+ from pathlib import Path
42
+
43
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
44
+
45
+ from plant_from_shape import (
46
+ AS_WORDS,
47
+ fail,
48
+ make_venv,
49
+ offline,
50
+ prove_the_network_is_off,
51
+ run,
52
+ say,
53
+ venv_bin,
54
+ )
55
+
56
+ #: The skill a person downloads, and the one it carries.
57
+ SKILL = "assistant"
58
+ INSIDE = "plant-from-your-mes"
59
+ #: Pages the folder is useless without, and the two files that prove the
60
+ #: nesting really happened. Named here rather than globbed so that a
61
+ #: `force-include` line somebody forgets is a red job and not a quiet gap.
62
+ MUST_CARRY = (
63
+ "SKILL.md",
64
+ "README.md",
65
+ "0-how-to-help.md",
66
+ "1-install.md",
67
+ "2-your-plant.md",
68
+ "3-shadow-mode.md",
69
+ "4-migration.md",
70
+ f"{INSIDE}/SKILL.md",
71
+ f"{INSIDE}/scripts/profile.py",
72
+ )
73
+
74
+
75
+ def what_the_checkout_holds(repo: Path) -> list[str]:
76
+ """Every file the unpacked folder should have, from the one copy in git."""
77
+ wanted = []
78
+ for name, under in ((SKILL, ""), (INSIDE, f"{INSIDE}/")):
79
+ folder = repo / "skills" / name
80
+ wanted += [f"{under}{p.relative_to(folder).as_posix()}"
81
+ for p in folder.rglob("*")
82
+ if p.is_file() and "__pycache__" not in p.parts]
83
+ return sorted(wanted)
84
+
85
+
86
+ def the_repository_has_one_copy(repo: Path) -> None:
87
+ """No `skills/assistant/plant-from-your-mes/` in git, and no symlink to it."""
88
+ second = repo / "skills" / SKILL / INSIDE
89
+ if second.exists() or second.is_symlink():
90
+ fail(f"skills/{SKILL}/{INSIDE} exists in the checkout. The nested folder is "
91
+ f"made at build time from fsmes.skills.INCLUDES, from the one copy in "
92
+ f"skills/{INSIDE}/ — a second copy in git drifts, and a symlink unpacks "
93
+ f"on Windows as a text file with a path in it.")
94
+ linked = [p for p in (repo / "skills" / SKILL).rglob("*") if p.is_symlink()]
95
+ if linked:
96
+ fail(f"symlink(s) in skills/{SKILL}/: {[p.name for p in linked]}")
97
+ say(f" skills/{SKILL}/ is {len(list((repo / 'skills' / SKILL).glob('*')))} real "
98
+ f"file(s) and no link; skills/{INSIDE}/ is the only copy of the nested folder")
99
+
100
+
101
+ def main() -> int:
102
+ parser = argparse.ArgumentParser(description=__doc__)
103
+ parser.add_argument("--wheel", required=True, help="the built wheel to prove")
104
+ args = parser.parse_args()
105
+
106
+ repo = Path(__file__).resolve().parents[2]
107
+ wheel = Path(args.wheel).resolve()
108
+ if not wheel.is_file():
109
+ fail(f"no wheel at {wheel}")
110
+
111
+ say("== one copy in the repository ==")
112
+ the_repository_has_one_copy(repo)
113
+
114
+ work = Path(tempfile.mkdtemp(prefix="fsmes-assistant-")).resolve()
115
+ say(f"\n== a clean machine: {work} ==")
116
+ if repo in work.parents:
117
+ fail(f"{work} is inside the checkout at {repo}; this proves nothing")
118
+
119
+ say("== the person's PC: a fresh venv with the wheel in it ==")
120
+ theirs = make_venv(work / ".venv-fsmes", wheel=wheel)
121
+ fsmes = venv_bin(theirs, "fsmes")
122
+ python = venv_bin(theirs, "python")
123
+ reported = subprocess.run([str(fsmes), "--version"], check=True, cwd=work,
124
+ capture_output=True, **AS_WORDS)
125
+ say(f" installed: {reported.stdout.strip()}")
126
+
127
+ say("== the network, off, for everything from here on ==")
128
+ environment = offline(dict(os.environ))
129
+ prove_the_network_is_off(python, environment)
130
+
131
+ say(f"== `fsmes skills list` names {SKILL} ==")
132
+ listed = run([str(fsmes), "skills", "list"], cwd=work, env=environment)
133
+ if "inside this installation" not in listed.stdout:
134
+ fail("`fsmes skills list` did not say the folder came out of the installation; "
135
+ "it may have found a checkout above the working directory instead")
136
+ # One folder per indented line; the last indented line is the hint, which
137
+ # has spaces in it and no skill name does.
138
+ named = [line.strip() for line in listed.stdout.splitlines()
139
+ if line.startswith(" ") and " " not in line.strip()]
140
+ if SKILL not in named:
141
+ fail(f"`fsmes skills list` did not name {SKILL}. It named: {named}. Check the "
142
+ f"force-include lines in pyproject.toml.")
143
+ say(f" {SKILL} is one of {len(named)} folder(s) listed: {', '.join(named)}")
144
+
145
+ say(f"== `fsmes skills unpack {SKILL}` writes the tree, offline ==")
146
+ run([str(fsmes), "skills", "unpack", SKILL, str(work / "out")],
147
+ cwd=work, env=environment)
148
+ folder = work / "out" / SKILL
149
+ written = sorted(p.relative_to(folder).as_posix()
150
+ for p in folder.rglob("*") if p.is_file())
151
+ say(f" {len(written)} file(s) written to {folder}")
152
+
153
+ missing = [f for f in MUST_CARRY if f not in written]
154
+ if missing:
155
+ fail(f"the unpacked folder is missing {', '.join(missing)}. If the pages are "
156
+ f"there and the nested folder is not, fsmes.skills.INCLUDES did not run; "
157
+ f"if a page is missing, add its force-include line to pyproject.toml.")
158
+
159
+ wanted = what_the_checkout_holds(repo)
160
+ if wanted != written:
161
+ fail(f"the unpacked folder is not the checkout's. In skills/ only: "
162
+ f"{sorted(set(wanted) - set(written)) or 'none'}. Unpacked only: "
163
+ f"{sorted(set(written) - set(wanted)) or 'none'}.")
164
+ differ = [f for f in wanted
165
+ if not filecmp.cmp(repo / "skills" / (f if f.startswith(f"{INSIDE}/")
166
+ else f"{SKILL}/{f}"),
167
+ folder / f, shallow=False)]
168
+ if differ:
169
+ fail(f"{len(differ)} file(s) differ from the checkout: {differ}")
170
+ say(f" byte-for-byte the checkout's skills/{SKILL}/ and skills/{INSIDE}/")
171
+
172
+ linked = [p.relative_to(folder).as_posix() for p in folder.rglob("*") if p.is_symlink()]
173
+ if linked:
174
+ fail(f"the unpacked folder contains symlink(s): {linked}")
175
+ nested = [f for f in written if f.startswith(f"{INSIDE}/")]
176
+ say(f" nothing in it is a symlink; {len(nested)} of {len(written)} file(s) are the "
177
+ f"nested {INSIDE}/ folder, which is stage 2")
178
+
179
+ say(f"\nthe assistant folder came out of the wheel on {sys.platform}, with the "
180
+ f"network off: {len(written)} file(s), {INSIDE}/ inside it, no second copy in "
181
+ f"git and no symlink anywhere.")
182
+ return 0
183
+
184
+
185
+ if __name__ == "__main__":
186
+ raise SystemExit(main())
@@ -0,0 +1,336 @@
1
+ #!/usr/bin/env python3
2
+ """`fsmes doctor` on the three states, with a secret planted where it would leak.
3
+
4
+ The file `doctor` writes is the one thing in this product that a person is
5
+ told to paste somewhere else - to an agent, or to this project. So the
6
+ promise on its first line, *no tag name, order number, product, lot, person,
7
+ host name or database URL is in it*, is checked here the only way a promise
8
+ like that can be: plant words that could only have come from the plant, run
9
+ the command, and grep the file for them.
10
+
11
+ The planted words are the handoff's own: a tag named `SECRET_TAG_XYZ` and an
12
+ order `WO-LEAK-1`, written into the log of a process that has died - which is
13
+ the one place in the file a plant's own words are quoted at all - together
14
+ with a traceback that carries them. This machine's host name and the OS user
15
+ who ran the command are checked for too: nobody notices their own user name
16
+ in a file they are pasting.
17
+
18
+ The states, in the order a person meets them:
19
+
20
+ * a home with **no plant** - the first half, and a file that says so;
21
+ * a **running** plant with `MES_SHADOW=true`, which is the only way the
22
+ second half's "in shadow mode" is reached, because no file on this machine
23
+ can turn shadow mode on and a running plant is the authority on its own;
24
+ * a **half-dead** plant - the API killed, the rest alive - where the file has
25
+ to name the process that is gone and its log, the same as `status`;
26
+ * a **stopped** plant, with the planted words now in every log.
27
+
28
+ And on each file: the leak check's verdict is on it, it is inside its own
29
+ 400-line budget, and `python -m fsmes doctor` answers on a PC where the
30
+ console script is not on PATH.
31
+
32
+ On ubuntu-latest and on windows-latest. Every path in the file is written by
33
+ `pathlib`, every log is read and written as UTF-8, and the whole thing is
34
+ processes and console output - which is where Windows differs, and nobody on
35
+ this project has a Windows machine to find out on.
36
+
37
+ Usage: python .github/scripts/doctor_writes_nothing_of_yours.py --wheel dist/<name>.whl
38
+ """
39
+
40
+ from __future__ import annotations
41
+
42
+ import argparse
43
+ import getpass
44
+ import json
45
+ import os
46
+ import signal
47
+ import socket
48
+ import subprocess
49
+ import sys
50
+ import tempfile
51
+ import time
52
+ import urllib.error
53
+ import urllib.request
54
+ from pathlib import Path
55
+
56
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
57
+
58
+ from plant_from_wheel import (
59
+ API,
60
+ AS_WORDS,
61
+ PLANT,
62
+ fail,
63
+ install,
64
+ port_answers,
65
+ print_in_the_words_the_plant_used,
66
+ say,
67
+ until,
68
+ venv_bin,
69
+ )
70
+
71
+ #: The words that must never come out the other side. A tag and an order,
72
+ #: because those are the two a plant has thousands of and cares most about.
73
+ TAG = "SECRET_TAG_XYZ"
74
+ ORDER = "WO-LEAK-1"
75
+
76
+ #: The process whose log the planted words go into: the one that is killed.
77
+ THE_ONE_THAT_ANSWERS = "the dashboard and the API"
78
+
79
+ #: What the file promises about itself, and may never be written without.
80
+ PASSED = "leak check: passed"
81
+
82
+ #: The file's own budget, from `fsmes.doctor.render.BUDGET`. Said here as a
83
+ #: number because this script runs against an installed wheel and imports
84
+ #: nothing from it.
85
+ BUDGET = 400
86
+
87
+
88
+ def run(command: list[str], **how) -> subprocess.CompletedProcess:
89
+ """A command, with its output read as words and printed as it stands."""
90
+ done = subprocess.run(command, capture_output=True, timeout=2700, **AS_WORDS, **how)
91
+ for line in ((done.stdout or "") + (done.stderr or "")).splitlines():
92
+ say(f" | {line}")
93
+ return done
94
+
95
+
96
+ def health_says_ok() -> bool:
97
+ url = f"http://{API[0]}:{API[1]}/health"
98
+ try:
99
+ with urllib.request.urlopen(url, timeout=10) as answer:
100
+ return json.loads(answer.read().decode("utf-8")).get("status") == "ok"
101
+ except (urllib.error.URLError, OSError, TimeoutError, ValueError):
102
+ return False
103
+
104
+
105
+ def the_processes_of(home: Path) -> list[dict]:
106
+ """What the plant recorded itself as, beside its pid file."""
107
+ recorded = home / "data" / f"{PLANT}.procs"
108
+ if not recorded.is_file():
109
+ fail(f"{recorded} is not there: a started plant records what each of its "
110
+ "processes is, and doctor cannot name a process without it")
111
+ return json.loads(recorded.read_text(encoding="utf-8"))
112
+
113
+
114
+ #: One of this product's own modules, as a traceback in a log would name it.
115
+ #: The file keeps a frame whose file is one this machine ships, and nothing
116
+ #: else - so the path planted here has to be a real installed path, which is
117
+ #: the only thing `doctor` will recognise.
118
+ OUR_MODULE = "fsmes/integrations/opc/agent.py"
119
+
120
+
121
+ def where_the_package_is(python: str) -> Path:
122
+ """The directory this product is installed in, asked of the installation."""
123
+ done = subprocess.run(
124
+ [python, "-c", "import fsmes, pathlib; print(pathlib.Path(fsmes.__file__).parent.parent)"],
125
+ capture_output=True, timeout=300, **AS_WORDS)
126
+ where = Path((done.stdout or "").strip())
127
+ if done.returncode != 0 or not where.is_dir():
128
+ fail(f"could not ask the installation where it is: {done.stdout}{done.stderr}")
129
+ return where
130
+
131
+
132
+ def plant_the_words_in(log: Path, module: Path) -> None:
133
+ """Write lines no scrub may carry into a log `doctor` will read.
134
+
135
+ Three shapes, because the scrub has three paths through a log: a
136
+ structured line whose values are a tag and an order; a structured line
137
+ with a traceback in it, which is the one thing the file keeps more of;
138
+ and console text, which cannot be read key by key at all.
139
+ """
140
+ lines = [
141
+ json.dumps({"timestamp": "2026-10-14T06:30:00.000000Z", "level": "info",
142
+ "logger": "opc.agent", "event": "read a tag",
143
+ "tag": TAG, "order": ORDER, "value": 712.5}),
144
+ json.dumps({"timestamp": "2026-10-14T06:30:01.000000Z", "level": "error",
145
+ "logger": "opc.agent", "event": "could not read",
146
+ "tag": TAG, "order": ORDER,
147
+ "exception": [{"exc_type": "TimeoutError",
148
+ "exc_value": f"no answer for {TAG} on {ORDER}",
149
+ "frames": [{"filename": str(module),
150
+ "lineno": 412, "name": "read_batch",
151
+ "locals": {"tag": TAG, "order": ORDER}}]}]}),
152
+ "Traceback (most recent call last):",
153
+ f' File "{module}", line 412, in read_batch',
154
+ f" value = client.read({TAG})",
155
+ f"RuntimeError: the session for {ORDER} is gone",
156
+ ]
157
+ with log.open("a", encoding="utf-8") as handle:
158
+ handle.write("\n".join(lines) + "\n")
159
+ say(f" planted {TAG} and {ORDER} in {log.name}")
160
+
161
+
162
+ def doctor(fsmes: str, work: Path, home: Path, out: Path, *more: str) -> str:
163
+ """Run `doctor`, time it, and hold the file to every promise it makes."""
164
+ environment = {**os.environ, "FSMES_HOME": str(home)}
165
+ started = time.monotonic()
166
+ done = run([fsmes, "doctor", "--out", str(out), *more], cwd=work, env=environment)
167
+ took = time.monotonic() - started
168
+ if done.returncode != 0:
169
+ fail(f"`fsmes doctor` exited {done.returncode}")
170
+ if not out.is_file():
171
+ fail(f"`fsmes doctor` said nothing was wrong and wrote no {out}")
172
+ text = out.read_text(encoding="utf-8")
173
+ lines = text.splitlines()
174
+ say(f" {out.name}: {len(lines)} lines, written in {took:.1f}s")
175
+
176
+ if PASSED not in text:
177
+ fail(f"{out.name} does not carry the leak check's verdict: a file whose first "
178
+ "line promises a check that did not pass is worse than no file")
179
+ if len(lines) > BUDGET:
180
+ fail(f"{out.name} is {len(lines)} lines; the budget is {BUDGET}, because a file "
181
+ "nobody reads is a file nobody pastes")
182
+ try:
183
+ who = getpass.getuser()
184
+ except Exception:
185
+ who = ""
186
+ for word, what in ((TAG, "a tag planted in a log"),
187
+ (ORDER, "an order planted in a log"),
188
+ (socket.gethostname(), "this machine's host name"),
189
+ (who, "the user who ran the command")):
190
+ if word and word in text:
191
+ fail(f"{what} ({word!r}) is in {out.name}. That is the whole promise on the "
192
+ "first line of the file, and it is the one thing this check exists for")
193
+ say(f" nothing of the plant, the machine or the person is in {out.name}")
194
+ return text
195
+
196
+
197
+ def must_say(text: str, where: str, wanted: list[tuple[str, str]]) -> None:
198
+ for phrase, why in wanted:
199
+ if phrase not in text:
200
+ fail(f"{where} never said {phrase!r}: {why}")
201
+
202
+
203
+ def main() -> int:
204
+ print_in_the_words_the_plant_used()
205
+ parser = argparse.ArgumentParser(description=__doc__)
206
+ parser.add_argument("--wheel", required=True, help="the built wheel to prove")
207
+ parser.add_argument("--speed", type=float, default=60.0,
208
+ help="replay speed; 60 plays a scripted hour in a minute")
209
+ args = parser.parse_args()
210
+
211
+ wheel = Path(args.wheel).resolve()
212
+ if not wheel.is_file():
213
+ fail(f"no wheel at {wheel}")
214
+
215
+ work = Path(tempfile.mkdtemp(prefix="fsmes-doctor-")).resolve()
216
+ home = work / "home"
217
+ say(f"== a clean machine: {work} ==")
218
+ environment = {**os.environ, "FSMES_HOME": str(home), "MES_SHADOW": "true"}
219
+ environment.pop("ANTHROPIC_API_KEY", None)
220
+
221
+ venv = install(wheel, work)
222
+ fsmes = str(venv_bin(venv, "fsmes"))
223
+ python = str(venv_bin(venv, "python"))
224
+
225
+ package = where_the_package_is(python)
226
+
227
+ say("== a home with no plant in it ==")
228
+ empty = doctor(fsmes, work, home, work / "no-plant.md")
229
+ must_say(empty, "no-plant.md", [
230
+ ("## This installation", "the first half is written whatever else is missing"),
231
+ ("This home has no plant in it yet",
232
+ "a home with no plant says so rather than printing empty sections"),
233
+ ("nothing to report yet",
234
+ "the second half stops when there is nothing measured, and does not pad"),
235
+ ])
236
+
237
+ say(f"== a running plant, watching only: fsmes demo {PLANT} ==")
238
+ if run([fsmes, "demo", PLANT, "--speed", str(args.speed)],
239
+ cwd=work, env=environment).returncode != 0:
240
+ fail(f"`fsmes demo {PLANT}` exited non-zero before anything was broken")
241
+ until("the dashboard answers", health_says_ok, ceiling=300)
242
+ running = doctor(fsmes, work, home, work / "running.md")
243
+ must_say(running, "running.md", [
244
+ ("shadow mode: **on**",
245
+ "MES_SHADOW was set in the shell that started the plant, and a running plant "
246
+ "is the only thing that knows it"),
247
+ ("asked the plant, which is running",
248
+ "where the answer came from is said, because a stopped plant cannot be asked"),
249
+ ("## Performance, toward migration", "the second half is reached in shadow mode"),
250
+ ("What is not built yet",
251
+ "the file ends in the same words the assistant uses for stage 4"),
252
+ ])
253
+
254
+ say("== half killing it: the dashboard and API process only ==")
255
+ recorded = the_processes_of(home)
256
+ api = [r for r in recorded if r["role"] == THE_ONE_THAT_ANSWERS]
257
+ if len(api) != 1:
258
+ fail(f"expected exactly one process recorded as {THE_ONE_THAT_ANSWERS!r}; "
259
+ f"got {json.dumps(recorded)}")
260
+ pid = int(api[0]["pid"])
261
+ say(f" kill {pid}")
262
+ os.kill(pid, signal.SIGTERM)
263
+ until("the dashboard has stopped answering", lambda: not health_says_ok(), ceiling=120)
264
+ # Now that nothing holds it open, the words go into the log of the process
265
+ # that died - which is the log a person is about to be told to read.
266
+ # `<plant>.procs` records the log by its name; the directory is the
267
+ # plant's own, which is where `fsmes.standalone` puts it.
268
+ written_to = Path(api[0]["log"])
269
+ if not written_to.is_absolute():
270
+ written_to = home / "logs" / PLANT / written_to
271
+ if not written_to.is_file():
272
+ fail(f"the plant recorded {api[0]['log']!r} as its log and {written_to} is not "
273
+ "a file; doctor is about to send a person to read it")
274
+ plant_the_words_in(written_to, package / OUR_MODULE)
275
+ half_dead = doctor(fsmes, work, home, work / "half-dead.md")
276
+ must_say(half_dead, "half-dead.md", [
277
+ ("**gone**", "the process that died is named as gone, the same as `status`"),
278
+ (THE_ONE_THAT_ANSWERS, "named by what it is for, not by its pid alone"),
279
+ ("api.jsonl", "and by the log that will say why it went"),
280
+ (f"fsmes demo {PLANT} stop", "with the command to type next"),
281
+ ("TimeoutError", "a traceback still says which exception it was"),
282
+ (OUR_MODULE, "and in which of this product's own modules"),
283
+ ("RuntimeError", "including a crash that never reached the JSON at all, "
284
+ "written into the same file as console text"),
285
+ ])
286
+ if '"locals"' in half_dead:
287
+ fail("a traceback's locals are in half-dead.md; every variable in scope at a "
288
+ "failure in this product is an order, a tag or a row")
289
+
290
+ say(f"== stopped: fsmes demo {PLANT} stop ==")
291
+ stopped_command = run([fsmes, "demo", PLANT, "stop"], cwd=work, env=environment)
292
+ if stopped_command.returncode != 0:
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")
296
+ logs = home / "logs" / PLANT
297
+ # The console logs last, so that they are among the most recently written
298
+ # and `doctor` reads them: a stopped plant has no record of its processes
299
+ # any more, and what it reads then is the newest files in the directory.
300
+ for log in [*sorted(logs.glob("*.jsonl")), *sorted(logs.glob("*.log"))]:
301
+ plant_the_words_in(log, package / OUR_MODULE)
302
+ stopped = doctor(fsmes, work, home, work / "stopped.md")
303
+ must_say(stopped, "stopped.md", [
304
+ ("### Processes", "a stopped plant still has logs, and they are what is left"),
305
+ ("Nothing is running for this file",
306
+ "a log with no process behind it says so rather than reading as live"),
307
+ ("RuntimeError",
308
+ "a traceback in console text keeps its skeleton too, and console text is "
309
+ "where an import-time crash lands and never reaches the JSON"),
310
+ ])
311
+
312
+ say("== and asked for a plant this home does not have ==")
313
+ missing = doctor(fsmes, work, home, work / "missing.md", "--plant", "machining")
314
+ must_say(missing, "missing.md", [
315
+ ("No plant called `machining`",
316
+ "a name typed on the command line is said back as it was typed, not shaped"),
317
+ (f"`{PLANT}`", "with the names this home does have"),
318
+ ])
319
+
320
+ say("== on a PC where the console script is not on PATH ==")
321
+ as_a_module = run([python, "-m", "fsmes", "doctor", "--out", str(work / "module.md")],
322
+ cwd=work, env={**os.environ, "FSMES_HOME": str(home)})
323
+ if as_a_module.returncode != 0:
324
+ fail("`python -m fsmes doctor` did not answer; on a PC where the Scripts folder "
325
+ "is not on PATH that is the only way in")
326
+ if PASSED not in (work / "module.md").read_text(encoding="utf-8"):
327
+ fail("`python -m fsmes doctor` wrote a file with no verdict on it")
328
+
329
+ say(f"\n`fsmes doctor` on {sys.platform} described a home with no plant, a running "
330
+ f"plant in shadow mode, a half-dead one and a stopped one. {TAG} and {ORDER} "
331
+ "were in the logs it read every time, and in none of the five files it wrote.")
332
+ return 0
333
+
334
+
335
+ if __name__ == "__main__":
336
+ raise SystemExit(main())