factorysemantics-mes 0.1.2__tar.gz → 0.3.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.
- factorysemantics_mes-0.3.0/.dockerignore +78 -0
- factorysemantics_mes-0.3.0/.env.example +112 -0
- factorysemantics_mes-0.3.0/.github/dependabot.yml +35 -0
- factorysemantics_mes-0.3.0/.github/scripts/demo_from_wheel.sh +64 -0
- factorysemantics_mes-0.3.0/.github/scripts/lab_starters.sh +138 -0
- factorysemantics_mes-0.3.0/.github/scripts/plant_from_wheel.py +354 -0
- factorysemantics_mes-0.3.0/.github/scripts/release_notes.sh +76 -0
- factorysemantics_mes-0.3.0/.github/scripts/upgrade_from_previous_release.sh +95 -0
- factorysemantics_mes-0.3.0/.github/workflows/ci.yml +463 -0
- factorysemantics_mes-0.3.0/.github/workflows/dco.yml +26 -0
- factorysemantics_mes-0.3.0/.github/workflows/docs.yml +44 -0
- factorysemantics_mes-0.3.0/.github/workflows/erpnext-live.yml +165 -0
- factorysemantics_mes-0.3.0/.github/workflows/release.yml +303 -0
- factorysemantics_mes-0.3.0/.github/workflows/scorecard.yml +28 -0
- factorysemantics_mes-0.3.0/.github/workflows/welcome.yml +42 -0
- factorysemantics_mes-0.3.0/.gitignore +80 -0
- factorysemantics_mes-0.3.0/CHANGELOG.md +4825 -0
- factorysemantics_mes-0.3.0/CITATION.cff +13 -0
- factorysemantics_mes-0.3.0/CONTRIBUTING.md +90 -0
- factorysemantics_mes-0.3.0/PKG-INFO +413 -0
- factorysemantics_mes-0.3.0/README.md +154 -0
- factorysemantics_mes-0.3.0/ROADMAP.md +153 -0
- factorysemantics_mes-0.3.0/alembic.ini +4 -0
- factorysemantics_mes-0.3.0/config/inbound_mapping.json +48 -0
- factorysemantics_mes-0.3.0/config/inbound_sql.json +25 -0
- factorysemantics_mes-0.3.0/config/tag_map_kepsim.json +103 -0
- factorysemantics_mes-0.3.0/deploy/README.md +142 -0
- factorysemantics_mes-0.3.0/deploy/fsmes-prod-plant@.service +20 -0
- factorysemantics_mes-0.3.0/deploy/promote.sh +394 -0
- factorysemantics_mes-0.3.0/docker/Dockerfile +51 -0
- factorysemantics_mes-0.3.0/docker/docker-compose.yml +119 -0
- factorysemantics_mes-0.3.0/docs/ARCHITECTURE.md +159 -0
- factorysemantics_mes-0.3.0/docs/LANDSCAPE.md +66 -0
- factorysemantics_mes-0.3.0/docs/agents/evals.md +61 -0
- factorysemantics_mes-0.3.0/docs/agents/write-discipline.md +60 -0
- factorysemantics_mes-0.3.0/docs/ai/ASSIST-EVAL.md +432 -0
- factorysemantics_mes-0.3.0/docs/ai/BUDGET.md +78 -0
- factorysemantics_mes-0.3.0/docs/ai/JEV-CALIBRATION.md +525 -0
- factorysemantics_mes-0.3.0/docs/ai/JEV.md +969 -0
- factorysemantics_mes-0.3.0/docs/ai/JUDGMENT-IN-THE-BUILD-LOOP.md +177 -0
- factorysemantics_mes-0.3.0/docs/ai/OBSERVABILITY.md +139 -0
- factorysemantics_mes-0.3.0/docs/ai/assist-eval/2026-09-27-live-admin.md +62 -0
- factorysemantics_mes-0.3.0/docs/ai/assist-eval/2026-09-27-live-operator.md +60 -0
- factorysemantics_mes-0.3.0/docs/ai/assist-eval/2026-09-27-scripted.md +40 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/full/calibration.md +143 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/full/d1-against-truth.json +532 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/full/d1-component-stopped-reporting.svg +53 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/full/d1-counter-went-backwards.svg +51 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/full/p1-by-confidence.svg +53 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/full/p1-by-probability.svg +53 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/stopped-not-why/calibration.md +143 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/stopped-not-why/d1-against-truth.json +532 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/stopped-not-why/d1-component-stopped-reporting.svg +53 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/stopped-not-why/d1-counter-went-backwards.svg +51 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/stopped-not-why/p1-by-confidence.svg +53 -0
- factorysemantics_mes-0.3.0/docs/ai/calibration/2026-09-17/stopped-not-why/p1-by-probability.svg +53 -0
- factorysemantics_mes-0.3.0/docs/decisions/0009-organisation-not-personal-account.md +24 -0
- factorysemantics_mes-0.3.0/docs/decisions/0010-github-discussions-only.md +25 -0
- factorysemantics_mes-0.3.0/docs/decisions/0011-mkdocs-material-generated-reference.md +25 -0
- factorysemantics_mes-0.3.0/docs/decisions/0012-contributor-covenant-3.md +24 -0
- factorysemantics_mes-0.3.0/docs/decisions/0013-governance-is-one-page.md +24 -0
- factorysemantics_mes-0.3.0/docs/decisions/0014-first-public-version-is-0-1-0.md +24 -0
- factorysemantics_mes-0.3.0/docs/decisions/0015-mcp-registry-name.md +24 -0
- factorysemantics_mes-0.3.0/docs/decisions/0016-no-trademark-registration.md +24 -0
- factorysemantics_mes-0.3.0/docs/decisions/0017-one-public-demo-gated-and-bounded.md +25 -0
- factorysemantics_mes-0.3.0/docs/decisions/0018-public-on-2026-09-08-and-the-pre-tag-check.md +26 -0
- factorysemantics_mes-0.3.0/docs/decisions/0019-count-everything-the-machine-counted.md +75 -0
- factorysemantics_mes-0.3.0/docs/decisions/0020-what-supported-means-for-an-erp-connector.md +129 -0
- factorysemantics_mes-0.3.0/docs/decisions/0021-one-database-per-plant.md +101 -0
- factorysemantics_mes-0.3.0/docs/decisions/0022-what-a-plant-pack-may-contain.md +135 -0
- factorysemantics_mes-0.3.0/docs/decisions/0023-the-fleet-console-observes.md +347 -0
- factorysemantics_mes-0.3.0/docs/decisions/0024-a-nonconformance-has-a-life.md +85 -0
- factorysemantics_mes-0.3.0/docs/decisions/0025-performance-is-measured-not-capped.md +116 -0
- factorysemantics_mes-0.3.0/docs/decisions/0026-counts-that-outrun-the-run-time.md +228 -0
- factorysemantics_mes-0.3.0/docs/decisions/0027-an-spc-signal-raises-a-hold.md +134 -0
- factorysemantics_mes-0.3.0/docs/decisions/0028-which-shift-a-minute-belongs-to.md +119 -0
- factorysemantics_mes-0.3.0/docs/decisions/0029-an-order-does-not-finish-itself.md +93 -0
- factorysemantics_mes-0.3.0/docs/decisions/0030-a-lost-connection-is-unknown-time.md +168 -0
- factorysemantics_mes-0.3.0/docs/decisions/0031-a-judgment-is-a-proposal.md +104 -0
- factorysemantics_mes-0.3.0/docs/decisions/0032-a-hosted-judgment-and-the-shadow.md +104 -0
- factorysemantics_mes-0.3.0/docs/decisions/0033-availability-is-a-share-of-what-was-watched.md +153 -0
- factorysemantics_mes-0.3.0/docs/decisions/0034-a-count-is-owed-until-it-is-booked.md +94 -0
- factorysemantics_mes-0.3.0/docs/decisions/0035-configuration-is-authored-by-roles-and-selected-by-operators.md +170 -0
- factorysemantics_mes-0.3.0/docs/decisions/0036-the-chart-draws-every-rule-the-plant-chooses-which-hold.md +119 -0
- factorysemantics_mes-0.3.0/docs/decisions/0038-an-agent-is-an-account-with-a-role-a-budget-and-a-cadence.md +250 -0
- factorysemantics_mes-0.3.0/docs/decisions/0039-an-analysis-is-recorded-code-that-can-only-read.md +147 -0
- factorysemantics_mes-0.3.0/docs/decisions/0040-the-chart-type-follows-the-sampling-plan.md +126 -0
- factorysemantics_mes-0.3.0/docs/decisions/0041-a-characteristic-the-plant-counts.md +171 -0
- factorysemantics_mes-0.3.0/docs/decisions/index.md +51 -0
- factorysemantics_mes-0.3.0/docs/design/STYLE.md +192 -0
- factorysemantics_mes-0.3.0/docs/design/agentic-harness.md +1686 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/admin-edit-roles.md +101 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/assistant-submits-an-inspection.md +62 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/clickable-machine-breadcrumbs.md +72 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/floor-machines-paginate-and-filter.md +60 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/measurements-card-filtering.md +41 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/measurements-characteristic-filter.md +50 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/nonconformance-lifecycle.md +92 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/order-card-search-finds-a-material.md +39 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/persistent-header-menu.md +72 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/review-station.md +72 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/scrap-reason-codes.md +68 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/shop-floor-actions-strip.md +48 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/specifications-card-filtering.md +34 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/specifications-server-paged.md +47 -0
- factorysemantics_mes-0.3.0/docs/design/backlog/station-quality-card.md +73 -0
- factorysemantics_mes-0.3.0/docs/design/config-assistance.md +1507 -0
- factorysemantics_mes-0.3.0/docs/design/config-audit-2026-09-21.md +651 -0
- factorysemantics_mes-0.3.0/docs/design/deep-analysis.md +1000 -0
- factorysemantics_mes-0.3.0/docs/design/m8-packs-and-fleet.md +625 -0
- factorysemantics_mes-0.3.0/docs/develop/erp-connectors.md +318 -0
- factorysemantics_mes-0.3.0/docs/develop/experiments.md +628 -0
- factorysemantics_mes-0.3.0/docs/develop/index.md +38 -0
- factorysemantics_mes-0.3.0/docs/develop/your-first-module.md +76 -0
- factorysemantics_mes-0.3.0/docs/hooks/generate.py +201 -0
- factorysemantics_mes-0.3.0/docs/index.md +69 -0
- factorysemantics_mes-0.3.0/docs/operate/administration-numbers.md +200 -0
- factorysemantics_mes-0.3.0/docs/operate/ai.md +353 -0
- factorysemantics_mes-0.3.0/docs/operate/assistant-coverage.md +196 -0
- factorysemantics_mes-0.3.0/docs/operate/backup.md +202 -0
- factorysemantics_mes-0.3.0/docs/operate/compatibility.md +56 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/completion-with-a-lot.json +14 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/completion-with-a-lot.xml +16 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/completion-with-an-over-run.json +14 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/completion-with-an-over-run.xml +16 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/completion-without-a-lot.json +14 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/completion-without-a-lot.xml +15 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/operation-clean.json +22 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/operation-clean.xml +23 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/operation-over-run.json +22 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/operation-over-run.xml +23 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/operation-with-scrap-and-components.json +35 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-examples/operation-with-scrap-and-components.xml +35 -0
- factorysemantics_mes-0.3.0/docs/operate/confirmation-files.md +131 -0
- factorysemantics_mes-0.3.0/docs/operate/coverage.md +210 -0
- factorysemantics_mes-0.3.0/docs/operate/deploy.md +151 -0
- factorysemantics_mes-0.3.0/docs/operate/engineering-numbers.md +201 -0
- factorysemantics_mes-0.3.0/docs/operate/erp-settings.md +169 -0
- factorysemantics_mes-0.3.0/docs/operate/erpnext.md +215 -0
- factorysemantics_mes-0.3.0/docs/operate/first-plant.md +458 -0
- factorysemantics_mes-0.3.0/docs/operate/first-week.md +113 -0
- factorysemantics_mes-0.3.0/docs/operate/fleet.md +220 -0
- factorysemantics_mes-0.3.0/docs/operate/images/review-walk-station.png +0 -0
- factorysemantics_mes-0.3.0/docs/operate/images/review-walkthrough.png +0 -0
- factorysemantics_mes-0.3.0/docs/operate/inbound.md +588 -0
- factorysemantics_mes-0.3.0/docs/operate/index.md +34 -0
- factorysemantics_mes-0.3.0/docs/operate/modules.md +152 -0
- factorysemantics_mes-0.3.0/docs/operate/opc-disconnections.md +143 -0
- factorysemantics_mes-0.3.0/docs/operate/opc-readonly.md +293 -0
- factorysemantics_mes-0.3.0/docs/operate/packs.md +280 -0
- factorysemantics_mes-0.3.0/docs/operate/plant-from-your-mes.md +174 -0
- factorysemantics_mes-0.3.0/docs/operate/quality-numbers.md +230 -0
- factorysemantics_mes-0.3.0/docs/operate/quality-severities.md +152 -0
- factorysemantics_mes-0.3.0/docs/operate/registry.md +68 -0
- factorysemantics_mes-0.3.0/docs/operate/releasing.md +87 -0
- factorysemantics_mes-0.3.0/docs/operate/shadow-mode.md +190 -0
- factorysemantics_mes-0.3.0/docs/operate/shadow-scorecard.md +189 -0
- factorysemantics_mes-0.3.0/docs/operate/the-simulated-floor.md +257 -0
- factorysemantics_mes-0.3.0/docs/operate/tls.md +167 -0
- factorysemantics_mes-0.3.0/docs/operate/uns.md +286 -0
- factorysemantics_mes-0.3.0/docs/operate/upgrade.md +458 -0
- factorysemantics_mes-0.3.0/docs/operate/who-names-the-reasons.md +422 -0
- factorysemantics_mes-0.3.0/docs/plant/first-line.md +66 -0
- factorysemantics_mes-0.3.0/docs/plant/images/spc-xbar-and-r.png +0 -0
- factorysemantics_mes-0.3.0/docs/plant/index.md +18 -0
- factorysemantics_mes-0.3.0/docs/plant/never-invent-production.md +125 -0
- factorysemantics_mes-0.3.0/docs/plant/quality-signals.md +338 -0
- factorysemantics_mes-0.3.0/docs/plant/reading-a-trend.md +122 -0
- factorysemantics_mes-0.3.0/docs/plant/reading-oee.md +221 -0
- factorysemantics_mes-0.3.0/docs/plant/shifts.md +145 -0
- factorysemantics_mes-0.3.0/docs/releases/0.2.0.md +133 -0
- factorysemantics_mes-0.3.0/docs/releases/0.3.0.md +213 -0
- factorysemantics_mes-0.3.0/docs/releases/index.md +18 -0
- factorysemantics_mes-0.3.0/labs/cutlery/README.md +182 -0
- factorysemantics_mes-0.3.0/labs/cutlery/fleet.toml +14 -0
- factorysemantics_mes-0.3.0/labs/cutlery/init.py +199 -0
- factorysemantics_mes-0.3.0/labs/cutlery/masterdata/downtime_reasons.json +32 -0
- factorysemantics_mes-0.3.0/labs/cutlery/masterdata/nc_severities.json +12 -0
- factorysemantics_mes-0.3.0/labs/cutlery/plant.toml +51 -0
- factorysemantics_mes-0.3.0/labs/cutlery/run_cutlery.py +381 -0
- factorysemantics_mes-0.3.0/labs/erpnext/VERSIONS.md +34 -0
- factorysemantics_mes-0.3.0/labs/erpnext/docker-compose.yml +202 -0
- factorysemantics_mes-0.3.0/labs/erpnext/seed_erpnext.py +296 -0
- factorysemantics_mes-0.3.0/labs/experiments/lost-connection.toml +82 -0
- factorysemantics_mes-0.3.0/labs/experiments/one-line-bad-hour.toml +90 -0
- factorysemantics_mes-0.3.0/labs/experiments/over-run.toml +85 -0
- factorysemantics_mes-0.3.0/labs/experiments/scrap-burst.toml +64 -0
- factorysemantics_mes-0.3.0/labs/experiments/starved-and-blocked.toml +64 -0
- factorysemantics_mes-0.3.0/labs/experiments/two-plants-two-zones.toml +109 -0
- factorysemantics_mes-0.3.0/labs/kepsim/line.json +339 -0
- factorysemantics_mes-0.3.0/labs/kepsim/scenario.md +77 -0
- factorysemantics_mes-0.3.0/labs/megafactory/fleet.toml +13 -0
- factorysemantics_mes-0.3.0/labs/megafactory/full/plant.toml +43 -0
- factorysemantics_mes-0.3.0/labs/megafactory/full/surfaces.py +371 -0
- factorysemantics_mes-0.3.0/labs/multiplant/README.md +400 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/floor.json +240 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/line.json +543 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/README.md +177 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/bom.json +32 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/dispatch_rules.json +27 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/downtime_reasons.json +37 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/equipment.json +61 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/gauges.json +32 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/lots.json +27 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/maintenance_plans.json +88 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/materials.json +38 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/nc_severities.json +12 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/personnel.json +43 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/personnel_skills.json +47 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/quality_specs.json +24 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/roster.json +30 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/routings.json +39 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/shifts.json +16 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/skills.json +17 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/masterdata/work_orders.json +12 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/plant.toml +106 -0
- factorysemantics_mes-0.3.0/labs/multiplant/bottling/tag_map.json +103 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/README.md +74 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/floor.json +10 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/mappings/inbound_mapping.json +16 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/masterdata/downtime_reasons.json +32 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/masterdata/equipment.json +10 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/masterdata/lots.json +3 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/masterdata/materials.json +4 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/masterdata/nc_severities.json +12 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/masterdata/quality_specs.json +3 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/masterdata/routings.json +13 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/masterdata/work_orders.json +7 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/plant.toml +114 -0
- factorysemantics_mes-0.3.0/labs/multiplant/finewire/tag_map.json +62 -0
- factorysemantics_mes-0.3.0/labs/multiplant/fleet.toml +15 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/floor.json +10 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/README.md +32 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/downtime_reasons.json +32 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/equipment.json +9 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/lots.json +3 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/materials.json +4 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/nc_severities.json +12 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/quality_specs.json +3 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/routings.json +12 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/masterdata/work_orders.json +11 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/plant.toml +51 -0
- factorysemantics_mes-0.3.0/labs/multiplant/machining/tag_map.json +59 -0
- factorysemantics_mes-0.3.0/mkdocs.yml +205 -0
- factorysemantics_mes-0.3.0/pyproject.toml +215 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/FORMAT.md +125 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/SKILL.md +225 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/example/plant-shape.toml +1172 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/01_inventory.sql +17 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/01b_row_count.sql +5 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/02_columns.sql +25 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/03_window.sql +12 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/04_column_profile.sql +11 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/04b_column_sample.sql +12 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/05_assets.sql +12 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/05b_tag_samples.sql +31 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/05c_tag_samples_nostate.sql +22 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/06_states.sql +22 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/06b_production.sql +15 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/06c_quality.sql +16 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/06d_orders.sql +11 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/06e_shifts.sql +11 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/06f_documents.sql +11 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/mssql/07_erp.sql +23 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/01_inventory.sql +9 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/01b_row_count.sql +5 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/02_columns.sql +15 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/03_window.sql +12 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/04_column_profile.sql +11 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/04b_column_sample.sql +13 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/05_assets.sql +12 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/05b_tag_samples.sql +31 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/05c_tag_samples_nostate.sql +22 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/06_states.sql +22 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/06b_production.sql +15 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/06c_quality.sql +16 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/06d_orders.sql +11 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/06e_shifts.sql +11 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/06f_documents.sql +11 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/queries/sqlite/07_erp.sql +23 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/scripts/explain.py +242 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/scripts/leakcheck.py +277 -0
- factorysemantics_mes-0.3.0/skills/plant-from-your-mes/scripts/profile.py +1481 -0
- factorysemantics_mes-0.3.0/src/fsmes/__init__.py +17 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/app.py +244 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/deps.py +202 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/idempotency.py +79 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/paging.py +80 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/adjustments.py +70 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/admin.py +200 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/analysis.py +489 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/assist.py +481 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/auth.py +102 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/dashboard.py +823 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/design.py +230 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/equipment.py +225 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/execution.py +162 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/kpis.py +37 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/maintenance.py +468 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/masterdata.py +253 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/ops.py +191 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/quality.py +798 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/reasons.py +125 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/scheduling.py +102 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/severities.py +128 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/system.py +459 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/triggers.py +107 -0
- factorysemantics_mes-0.3.0/src/fsmes/api/routers/workorders.py +255 -0
- factorysemantics_mes-0.3.0/src/fsmes/assist_coverage.py +772 -0
- factorysemantics_mes-0.3.0/src/fsmes/backup.py +356 -0
- factorysemantics_mes-0.3.0/src/fsmes/cli.py +4353 -0
- factorysemantics_mes-0.3.0/src/fsmes/config.py +909 -0
- factorysemantics_mes-0.3.0/src/fsmes/core/oplock.py +84 -0
- factorysemantics_mes-0.3.0/src/fsmes/db.py +206 -0
- factorysemantics_mes-0.3.0/src/fsmes/demo_feed.py +101 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/__init__.py +189 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/ai_turns.py +145 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/audit.py +39 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/calendar.py +82 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/common.py +59 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/crew.py +191 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/equipment.py +114 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/execution.py +114 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/gauges.py +82 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/inbound.py +106 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/integration.py +60 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/maintenance.py +208 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/masterdata.py +222 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/plant_settings.py +76 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/quality.py +305 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/reasons.py +81 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/severities.py +94 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/timeseries.py +37 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/triggers.py +90 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/uns.py +43 -0
- factorysemantics_mes-0.3.0/src/fsmes/domain/workorders.py +113 -0
- factorysemantics_mes-0.3.0/src/fsmes/fleet/__init__.py +28 -0
- factorysemantics_mes-0.3.0/src/fsmes/fleet/commands.py +411 -0
- factorysemantics_mes-0.3.0/src/fsmes/fleet/console.py +269 -0
- factorysemantics_mes-0.3.0/src/fsmes/fleet/logsink.py +101 -0
- factorysemantics_mes-0.3.0/src/fsmes/fleet/observe.py +203 -0
- factorysemantics_mes-0.3.0/src/fsmes/fleet/owned.py +500 -0
- factorysemantics_mes-0.3.0/src/fsmes/identity.py +286 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/b2mml.py +194 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/base.py +277 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/conformance.py +232 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/contract.py +156 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/erpnext_adapter.py +517 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/erpnext_setup.py +208 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/examples.py +267 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/file_adapter.py +228 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/incumbent.py +324 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/rest_adapter.py +111 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/schema.py +411 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/scorecard.py +620 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/scorecard_html.py +158 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/sync.py +84 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/erp/validate.py +383 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/events.py +139 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/inbound/__init__.py +13 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/inbound/contract.py +232 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/inbound/folder.py +462 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/inbound/mqtt.py +620 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/inbound/sql.py +673 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/jev/__init__.py +64 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/jev/client.py +309 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/jev/transport.py +433 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/opc/agent.py +1279 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/opc/csv_replay.py +594 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/opc/tag_map.py +297 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/uns/__init__.py +7 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/uns/envelope.py +60 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/uns/publisher.py +169 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/uns/topics.py +219 -0
- factorysemantics_mes-0.3.0/src/fsmes/integrations/uns/transport.py +193 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/__init__.py +22 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/assist_eval.py +555 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/assist_fixtures.py +901 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/assist_seed.py +336 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/build.py +203 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/console.py +236 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/feedback.py +229 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/measure.py +1529 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/observe.py +233 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/plan.py +302 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/report.py +885 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/review.py +333 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/run.py +497 -0
- factorysemantics_mes-0.3.0/src/fsmes/lab/truth.py +255 -0
- factorysemantics_mes-0.3.0/src/fsmes/logging.py +146 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/adjustments.py +51 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/analysis.py +685 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/maintenance.py +262 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/masterdata.py +143 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/quality.py +355 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/reasons.py +64 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/scheduling.py +93 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/settings.py +482 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/severities.py +58 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp/triggers.py +60 -0
- factorysemantics_mes-0.3.0/src/fsmes/mcp_server.py +1052 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/env.py +51 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/a1c47f8b2d93_what_a_maintenance_job_needs_of_the_line.py +66 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/a1c5e70b2d94_plant_settings.py +57 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/a3f6c81d09e2_unassigned_production.py +40 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/a4d9c2e70f18_uns_publications.py +47 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/a9c4e17b3d60_spc_signals_act.py +67 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/b1f4c73a9e08_nonconformance_lifecycle.py +45 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/b1f4c7a2e903_production_logs_equipment_ts_index.py +36 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/b3f9c07e51ad_ai_turns.py +55 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/b5c1d09e73af_inbound_events_and_their_source.py +61 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/b9f31c7a4e50_a_characteristic_inspected_n_at_a_time.py +94 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/c1e7a04b93d5_downtime_reasons.py +57 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/c3d7e91a4b28_equipment_connections.py +52 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/c6a4b81f39d7_shift_attribution.py +181 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/c7a2e94b16d3_five_facts_the_plant_was_dropping.py +79 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/c8b1e40d7a92_erp_messages_direction_index.py +34 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/d2b7e51c9a04_nc_severities.py +56 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/d4e8a1c93b70_a_characteristic_the_plant_counts.py +105 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/d7b4e92a1c58_the_maintenance_crew_and_its_rules.py +155 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/d9a3f61c48e0_inbound_sql_watermarks.py +52 -0
- factorysemantics_mes-0.3.0/src/fsmes/migrations/versions/e3c8a17d5b46_gauge_warning_and_pieces.py +55 -0
- factorysemantics_mes-0.3.0/src/fsmes/modules.py +1406 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/__init__.py +24 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/apply.py +626 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/check.py +1204 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/fleet.py +147 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/format.py +1144 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/masterdata.py +982 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/migrate.py +239 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/plan.py +151 -0
- factorysemantics_mes-0.3.0/src/fsmes/pack/repoint.py +89 -0
- factorysemantics_mes-0.3.0/src/fsmes/plant.py +786 -0
- factorysemantics_mes-0.3.0/src/fsmes/schema.py +226 -0
- factorysemantics_mes-0.3.0/src/fsmes/seed_kepsim.py +218 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/__init__.py +48 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/agent.py +2209 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/ai_status.py +296 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/ai_trace.py +330 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/analysis.py +1094 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/assist_eval.py +1142 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/assistant.py +2799 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/audit.py +69 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/auth.py +247 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/calendar.py +592 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/capabilities.py +345 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/coa.py +537 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/connection.py +273 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/coverage.py +809 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/design.py +477 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/dispatch.py +1475 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/documents.py +254 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/drafting.py +181 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/equipment.py +552 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/erp.py +414 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/execution.py +452 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/gauges.py +303 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/inbound.py +316 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/line.py +373 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/line_clock.py +83 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/maintenance.py +522 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/masterdata.py +360 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/moment.py +542 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/oee.py +194 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/outbox.py +168 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/plant_settings.py +417 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/quality.py +708 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/reasons.py +205 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/review.py +611 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/scheduling.py +321 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/serialization.py +881 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/severities.py +221 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/spc.py +2037 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/spc_point.py +1294 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/state_block.py +915 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/tags.py +404 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/trace_analysis.py +1049 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/trend.py +700 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/triggers.py +400 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/uns.py +268 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/vocabulary.py +418 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/walkthroughs.py +185 -0
- factorysemantics_mes-0.3.0/src/fsmes/services/workorders.py +292 -0
- factorysemantics_mes-0.3.0/src/fsmes/shadow.py +606 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/__init__.py +17 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/agent_eval.py +627 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/autoloop.py +365 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/calibration.py +866 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/config_audit.py +920 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/config_audit_curated.py +1022 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/generate.py +943 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/labelled.py +645 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/mcp_server.py +442 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/measurement.py +482 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/operations.py +2532 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/runner.py +786 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/score.py +839 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/sweep.py +146 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/triage.py +339 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/truth.py +169 -0
- factorysemantics_mes-0.3.0/src/fsmes/sim/ui_check.py +420 -0
- factorysemantics_mes-0.3.0/src/fsmes/skills.py +120 -0
- factorysemantics_mes-0.3.0/src/fsmes/standalone.py +409 -0
- factorysemantics_mes-0.3.0/src/fsmes/storage.py +212 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/adjustments.html +90 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/adjustments.js +145 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/admin.html +127 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/admin.js +409 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/ai.css +166 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/ai.html +267 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/ai.js +1354 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/analysis.css +155 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/analysis.html +118 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/analysis.js +401 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/app.js +882 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/assist.js +1057 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/common.js +1150 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/config.html +73 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/config.js +354 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/design.css +72 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/design.js +230 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/fleet.css +69 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/fleet.html +67 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/fleet.js +200 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/gauges.html +130 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/gauges.js +161 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/index.html +234 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/instructions.html +101 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/instructions.js +313 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/kit.js +3132 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/line-page.js +149 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/line.css +235 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/machine.css +144 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/machine.html +235 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/machine.js +1281 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/machines.js +139 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/maintenance.css +117 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/maintenance.html +237 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/maintenance.js +872 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/masterdata.html +208 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/masterdata.js +351 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/ops.js +315 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/orders.css +130 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/orders.html +214 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/orders.js +616 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/quality.css +78 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/quality.html +159 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/quality.js +769 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/reasons.html +114 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/reasons.js +289 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/schedule.html +135 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/schedule.js +209 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/severities.html +111 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/severities.js +285 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/spc.css +39 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/spc.html +155 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/spc.js +1791 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/station.css +119 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/station.html +171 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/station.js +777 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/styles.css +981 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/themes.css +116 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/trace.html +121 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/triggers.html +122 -0
- factorysemantics_mes-0.3.0/src/fsmes/web/triggers.js +196 -0
- factorysemantics_mes-0.3.0/tests/assist_suite/README.md +62 -0
- factorysemantics_mes-0.3.0/tests/assist_suite/admin.toml +701 -0
- factorysemantics_mes-0.3.0/tests/assist_suite/agent.toml +156 -0
- factorysemantics_mes-0.3.0/tests/assist_suite/analyst.toml +455 -0
- factorysemantics_mes-0.3.0/tests/assist_suite/operator.toml +424 -0
- factorysemantics_mes-0.3.0/tests/assist_suite/supervisor.toml +344 -0
- factorysemantics_mes-0.3.0/tests/conftest.py +235 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/line/bench.json +28 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/packs/bench/tag_map.json +14 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/recorded/bench-scorecard.json +25 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/replay/bench/Line.csv +401 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/replay/bench/Pack.csv +401 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/replay/bench/Press.csv +401 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/replay/bench/Trim.csv +401 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/replay/bench/Weld.csv +401 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/replay/bench/schema.ini +63 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-run/scores.json +39 -0
- factorysemantics_mes-0.3.0/tests/fixtures/labelled-set.json +625 -0
- factorysemantics_mes-0.3.0/tests/live_replies.py +28 -0
- factorysemantics_mes-0.3.0/tests/page_anchors.py +60 -0
- factorysemantics_mes-0.3.0/tests/test_a_block_on_the_state_timeline_carries_the_records_behind_it.py +742 -0
- factorysemantics_mes-0.3.0/tests/test_a_characteristic_inspected_five_at_a_time.py +593 -0
- factorysemantics_mes-0.3.0/tests/test_a_characteristic_the_plant_counts.py +788 -0
- factorysemantics_mes-0.3.0/tests/test_a_chart_draws_only_what_the_api_measured.py +2733 -0
- factorysemantics_mes-0.3.0/tests/test_a_plant_books_while_its_dashboard_is_read.py +436 -0
- factorysemantics_mes-0.3.0/tests/test_a_plant_from_the_package_writes_only_to_a_users_own_directory.py +329 -0
- factorysemantics_mes-0.3.0/tests/test_a_plant_logs_at_a_rate_a_year_can_stand.py +217 -0
- factorysemantics_mes-0.3.0/tests/test_a_plant_shape_built_blind_from_an_unknown_sql_mes_is_the_bottling_line.py +403 -0
- factorysemantics_mes-0.3.0/tests/test_a_plant_starts_and_stops_the_same_way_on_windows.py +254 -0
- factorysemantics_mes-0.3.0/tests/test_a_point_on_the_control_chart_carries_the_records_behind_it.py +907 -0
- factorysemantics_mes-0.3.0/tests/test_a_refusal_names_the_capability_and_who_holds_it.py +389 -0
- factorysemantics_mes-0.3.0/tests/test_a_sample_on_the_control_chart_carries_the_five_bottles_behind_it.py +626 -0
- factorysemantics_mes-0.3.0/tests/test_a_signature_they_hold_is_a_walk_and_not_a_refusal.py +145 -0
- factorysemantics_mes-0.3.0/tests/test_a_walk_waits_for_a_control_the_page_is_still_drawing.py +313 -0
- factorysemantics_mes-0.3.0/tests/test_agent.py +1369 -0
- factorysemantics_mes-0.3.0/tests/test_agent_batching.py +413 -0
- factorysemantics_mes-0.3.0/tests/test_agent_eval.py +200 -0
- factorysemantics_mes-0.3.0/tests/test_ai_status.py +217 -0
- factorysemantics_mes-0.3.0/tests/test_an_analysis_counts_people_before_it_names_one.py +860 -0
- factorysemantics_mes-0.3.0/tests/test_an_exploration_draws_what_the_plant_measured.py +658 -0
- factorysemantics_mes-0.3.0/tests/test_analysis.py +466 -0
- factorysemantics_mes-0.3.0/tests/test_api.py +103 -0
- factorysemantics_mes-0.3.0/tests/test_approval_review.py +592 -0
- factorysemantics_mes-0.3.0/tests/test_assist_suite_scripted.py +1725 -0
- factorysemantics_mes-0.3.0/tests/test_assistant.py +216 -0
- factorysemantics_mes-0.3.0/tests/test_auth.py +115 -0
- factorysemantics_mes-0.3.0/tests/test_autoloop.py +170 -0
- factorysemantics_mes-0.3.0/tests/test_backup.py +274 -0
- factorysemantics_mes-0.3.0/tests/test_bottling_pack.py +381 -0
- factorysemantics_mes-0.3.0/tests/test_capabilities.py +440 -0
- factorysemantics_mes-0.3.0/tests/test_cli.py +111 -0
- factorysemantics_mes-0.3.0/tests/test_clicking_a_block_on_the_state_timeline_opens_the_records_behind_it.py +653 -0
- factorysemantics_mes-0.3.0/tests/test_clicking_a_lot_on_the_spc_chart_opens_which_defects.py +886 -0
- factorysemantics_mes-0.3.0/tests/test_clicking_a_point_on_the_spc_chart_opens_the_records_behind_it.py +1062 -0
- factorysemantics_mes-0.3.0/tests/test_clicking_a_point_on_the_trend_graph_opens_the_records_behind_it.py +949 -0
- factorysemantics_mes-0.3.0/tests/test_clicking_a_sample_on_the_spc_chart_opens_the_five_bottles.py +896 -0
- factorysemantics_mes-0.3.0/tests/test_coa.py +92 -0
- factorysemantics_mes-0.3.0/tests/test_config_audit.py +499 -0
- factorysemantics_mes-0.3.0/tests/test_configuration_sections.py +187 -0
- factorysemantics_mes-0.3.0/tests/test_core_purity.py +393 -0
- factorysemantics_mes-0.3.0/tests/test_coverage_ledger.py +386 -0
- factorysemantics_mes-0.3.0/tests/test_demo_verdict.py +63 -0
- factorysemantics_mes-0.3.0/tests/test_design.py +225 -0
- factorysemantics_mes-0.3.0/tests/test_downtime_reasons.py +567 -0
- factorysemantics_mes-0.3.0/tests/test_environments.py +187 -0
- factorysemantics_mes-0.3.0/tests/test_equipment_oee.py +166 -0
- factorysemantics_mes-0.3.0/tests/test_erp_confirmation_files.py +275 -0
- factorysemantics_mes-0.3.0/tests/test_erp_conformance.py +272 -0
- factorysemantics_mes-0.3.0/tests/test_erp_contract.py +247 -0
- factorysemantics_mes-0.3.0/tests/test_erp_roundtrip.py +60 -0
- factorysemantics_mes-0.3.0/tests/test_erpnext.py +519 -0
- factorysemantics_mes-0.3.0/tests/test_erpnext_live.py +517 -0
- factorysemantics_mes-0.3.0/tests/test_every_browser_test_is_in_the_browser_tier.py +69 -0
- factorysemantics_mes-0.3.0/tests/test_every_settings_list_fits_in_one_tool_result.py +138 -0
- factorysemantics_mes-0.3.0/tests/test_every_show_me_lands_on_the_real_control.py +643 -0
- factorysemantics_mes-0.3.0/tests/test_every_write_route_has_a_tool_or_a_reason.py +245 -0
- factorysemantics_mes-0.3.0/tests/test_every_write_tool_names_the_capability_its_route_demands.py +172 -0
- factorysemantics_mes-0.3.0/tests/test_everything_the_model_said_in_one_turn_reaches_the_reply.py +289 -0
- factorysemantics_mes-0.3.0/tests/test_execution.py +62 -0
- factorysemantics_mes-0.3.0/tests/test_file_erp.py +71 -0
- factorysemantics_mes-0.3.0/tests/test_fleet_console.py +448 -0
- factorysemantics_mes-0.3.0/tests/test_fleet_create_makes_a_usable_plant.py +325 -0
- factorysemantics_mes-0.3.0/tests/test_fleet_ownership.py +666 -0
- factorysemantics_mes-0.3.0/tests/test_fleet_plan.py +224 -0
- factorysemantics_mes-0.3.0/tests/test_inbound.py +285 -0
- factorysemantics_mes-0.3.0/tests/test_inbound_folder.py +293 -0
- factorysemantics_mes-0.3.0/tests/test_inbound_mqtt.py +626 -0
- factorysemantics_mes-0.3.0/tests/test_inbound_sql.py +478 -0
- factorysemantics_mes-0.3.0/tests/test_jev_agent_eval_scoring.py +263 -0
- factorysemantics_mes-0.3.0/tests/test_jev_calibration.py +519 -0
- factorysemantics_mes-0.3.0/tests/test_jev_fail_safe.py +160 -0
- factorysemantics_mes-0.3.0/tests/test_jev_labelled_set.py +270 -0
- factorysemantics_mes-0.3.0/tests/test_jev_run_log_triage.py +310 -0
- factorysemantics_mes-0.3.0/tests/test_jev_sdk_surface.py +258 -0
- factorysemantics_mes-0.3.0/tests/test_kepsim.py +367 -0
- factorysemantics_mes-0.3.0/tests/test_kpi_budget.py +200 -0
- factorysemantics_mes-0.3.0/tests/test_lab_connection.py +209 -0
- factorysemantics_mes-0.3.0/tests/test_lab_console.py +221 -0
- factorysemantics_mes-0.3.0/tests/test_lab_experiments.py +693 -0
- factorysemantics_mes-0.3.0/tests/test_lab_feedback.py +331 -0
- factorysemantics_mes-0.3.0/tests/test_lab_latency.py +467 -0
- factorysemantics_mes-0.3.0/tests/test_lab_order_book.py +574 -0
- factorysemantics_mes-0.3.0/tests/test_lab_orders.py +259 -0
- factorysemantics_mes-0.3.0/tests/test_lab_scenarios.py +271 -0
- factorysemantics_mes-0.3.0/tests/test_line_api.py +329 -0
- factorysemantics_mes-0.3.0/tests/test_live_admin_settings.py +464 -0
- factorysemantics_mes-0.3.0/tests/test_live_engineering_settings.py +613 -0
- factorysemantics_mes-0.3.0/tests/test_live_plant_settings.py +390 -0
- factorysemantics_mes-0.3.0/tests/test_maintenance.py +259 -0
- factorysemantics_mes-0.3.0/tests/test_maintenance_work_goes_to_the_right_trade.py +479 -0
- factorysemantics_mes-0.3.0/tests/test_mcp_product.py +853 -0
- factorysemantics_mes-0.3.0/tests/test_megafactory.py +163 -0
- factorysemantics_mes-0.3.0/tests/test_migrations_have_one_head.py +61 -0
- factorysemantics_mes-0.3.0/tests/test_module_wall.py +319 -0
- factorysemantics_mes-0.3.0/tests/test_nc_severities.py +489 -0
- factorysemantics_mes-0.3.0/tests/test_no_tenant_literals.py +362 -0
- factorysemantics_mes-0.3.0/tests/test_opc_disconnection.py +417 -0
- factorysemantics_mes-0.3.0/tests/test_outbox_events.py +257 -0
- factorysemantics_mes-0.3.0/tests/test_overproduction.py +218 -0
- factorysemantics_mes-0.3.0/tests/test_pack_format.py +834 -0
- factorysemantics_mes-0.3.0/tests/test_pack_third.py +220 -0
- factorysemantics_mes-0.3.0/tests/test_performance_at_replay_speed.py +376 -0
- factorysemantics_mes-0.3.0/tests/test_plant_identity.py +276 -0
- factorysemantics_mes-0.3.0/tests/test_plant_migrate.py +107 -0
- factorysemantics_mes-0.3.0/tests/test_plant_scale_lists.py +341 -0
- factorysemantics_mes-0.3.0/tests/test_plant_scale_ui.py +134 -0
- factorysemantics_mes-0.3.0/tests/test_plant_serve_only.py +43 -0
- factorysemantics_mes-0.3.0/tests/test_promote_script.py +502 -0
- factorysemantics_mes-0.3.0/tests/test_quality.py +211 -0
- factorysemantics_mes-0.3.0/tests/test_quality_numbers.py +431 -0
- factorysemantics_mes-0.3.0/tests/test_read_never_waits.py +326 -0
- factorysemantics_mes-0.3.0/tests/test_route_coverage.py +135 -0
- factorysemantics_mes-0.3.0/tests/test_routing_depth.py +177 -0
- factorysemantics_mes-0.3.0/tests/test_run_ports.py +251 -0
- factorysemantics_mes-0.3.0/tests/test_scale.py +83 -0
- factorysemantics_mes-0.3.0/tests/test_schema_upgrade.py +173 -0
- factorysemantics_mes-0.3.0/tests/test_serial_scale.py +343 -0
- factorysemantics_mes-0.3.0/tests/test_shadow_mode.py +516 -0
- factorysemantics_mes-0.3.0/tests/test_shadow_scorecard.py +334 -0
- factorysemantics_mes-0.3.0/tests/test_shift_attribution.py +484 -0
- factorysemantics_mes-0.3.0/tests/test_sim.py +441 -0
- factorysemantics_mes-0.3.0/tests/test_spc_gauges.py +231 -0
- factorysemantics_mes-0.3.0/tests/test_spc_moving_range.py +291 -0
- factorysemantics_mes-0.3.0/tests/test_spc_signals.py +290 -0
- factorysemantics_mes-0.3.0/tests/test_sqlite_write_locks.py +258 -0
- factorysemantics_mes-0.3.0/tests/test_status_names_its_database.py +231 -0
- factorysemantics_mes-0.3.0/tests/test_supply_chain_settings.py +412 -0
- factorysemantics_mes-0.3.0/tests/test_sweep_replay.py +216 -0
- factorysemantics_mes-0.3.0/tests/test_the_ai_screen_shows_a_conversation_and_gates_itself.py +352 -0
- factorysemantics_mes-0.3.0/tests/test_the_ai_tab_explores_and_draws_what_it_read.py +851 -0
- factorysemantics_mes-0.3.0/tests/test_the_ai_tab_says_what_the_assistant_costs_without_local_ai.py +303 -0
- factorysemantics_mes-0.3.0/tests/test_the_analyses_answer_an_agent_the_way_they_answer_a_screen.py +424 -0
- factorysemantics_mes-0.3.0/tests/test_the_analysis_agent_is_a_kind_of_its_own.py +520 -0
- factorysemantics_mes-0.3.0/tests/test_the_analysis_agent_is_asked_for_the_next_questions.py +81 -0
- factorysemantics_mes-0.3.0/tests/test_the_assistant_proposes_rather_than_asking.py +242 -0
- factorysemantics_mes-0.3.0/tests/test_the_assistant_reads_before_it_says_no.py +319 -0
- factorysemantics_mes-0.3.0/tests/test_the_bottling_shift_leaves_a_chain_a_person_can_walk_back.py +723 -0
- factorysemantics_mes-0.3.0/tests/test_the_calendar_tool_names_every_kind_its_api_accepts.py +67 -0
- factorysemantics_mes-0.3.0/tests/test_the_chart_comes_into_the_chat_and_stays_clickable.py +922 -0
- factorysemantics_mes-0.3.0/tests/test_the_chat_can_open_the_dossier_behind_a_charted_point.py +328 -0
- factorysemantics_mes-0.3.0/tests/test_the_control_chart_the_chat_reads_leaves_the_bottles_out.py +162 -0
- factorysemantics_mes-0.3.0/tests/test_the_conversation_is_cached_and_not_only_the_catalogue.py +115 -0
- factorysemantics_mes-0.3.0/tests/test_the_dispatcher_at_three_hundred_people.py +586 -0
- factorysemantics_mes-0.3.0/tests/test_the_docker_image_carries_the_packs.py +252 -0
- factorysemantics_mes-0.3.0/tests/test_the_gauges_screen_shows_the_two_scales_and_when_each_was_calibrated.py +226 -0
- factorysemantics_mes-0.3.0/tests/test_the_panel_can_ask_the_other_agent.py +246 -0
- factorysemantics_mes-0.3.0/tests/test_the_panel_keeps_one_brain_through_a_failed_turn.py +333 -0
- factorysemantics_mes-0.3.0/tests/test_the_plant_keeps_a_trace_of_what_its_ai_did.py +367 -0
- factorysemantics_mes-0.3.0/tests/test_the_plant_stops_dropping_five_facts_it_already_had.py +451 -0
- factorysemantics_mes-0.3.0/tests/test_the_release_body_github_will_accept.py +135 -0
- factorysemantics_mes-0.3.0/tests/test_the_screens_that_show_a_characteristic_inspected_five_at_a_time.py +492 -0
- factorysemantics_mes-0.3.0/tests/test_the_simulated_crew_does_the_work_it_was_given.py +561 -0
- factorysemantics_mes-0.3.0/tests/test_the_simulated_floor_plants_causes_an_engineer_can_find.py +1645 -0
- factorysemantics_mes-0.3.0/tests/test_the_simulated_floor_signs_in_again_when_its_login_runs_out.py +294 -0
- factorysemantics_mes-0.3.0/tests/test_the_skills_zip_holds_exactly_what_it_says_and_nothing_else.py +142 -0
- factorysemantics_mes-0.3.0/tests/test_the_spc_chart_wears_the_accepted_chart_look.py +111 -0
- factorysemantics_mes-0.3.0/tests/test_the_sql_server_query_set_is_not_sqlite_in_disguise.py +175 -0
- factorysemantics_mes-0.3.0/tests/test_the_station_redraws_only_what_changed.py +268 -0
- factorysemantics_mes-0.3.0/tests/test_the_station_says_when_no_order_is_open_on_the_plant.py +262 -0
- factorysemantics_mes-0.3.0/tests/test_the_suite_knows_its_database.py +25 -0
- factorysemantics_mes-0.3.0/tests/test_the_supervisor_writes_a_rule_as_a_sentence.py +609 -0
- factorysemantics_mes-0.3.0/tests/test_the_supervisors_screen_reads_the_shift_and_writes_a_rule.py +370 -0
- factorysemantics_mes-0.3.0/tests/test_the_trend_graph_walks_link_three_of_the_chain.py +340 -0
- factorysemantics_mes-0.3.0/tests/test_the_wheel_ships_the_lab_packs.py +95 -0
- factorysemantics_mes-0.3.0/tests/test_two_tags_on_one_axis_and_the_records_behind_a_point.py +538 -0
- factorysemantics_mes-0.3.0/tests/test_ui_check.py +226 -0
- factorysemantics_mes-0.3.0/tests/test_ui_lists_filter_at_scale.py +401 -0
- factorysemantics_mes-0.3.0/tests/test_ui_nav.py +425 -0
- factorysemantics_mes-0.3.0/tests/test_ui_oee_above_rated.py +246 -0
- factorysemantics_mes-0.3.0/tests/test_uns.py +816 -0
- factorysemantics_mes-0.3.0/tests/test_walkthroughs.py +152 -0
- factorysemantics_mes-0.3.0/tests/test_web.py +432 -0
- factorysemantics_mes-0.3.0/tests/test_what_a_maintenance_job_needs_of_the_line.py +234 -0
- factorysemantics_mes-0.3.0/tests/ui/baselines/control-room.json +1038 -0
- factorysemantics_mes-0.3.0/tests/ui/baselines/daylight.json +1038 -0
- factorysemantics_mes-0.3.0/tests/ui/baselines/high-contrast.json +1038 -0
- factorysemantics_mes-0.3.0/tests/ui/baselines/night-shift.json +1038 -0
- factorysemantics_mes-0.3.0/tests/unknown_mes.py +476 -0
- factorysemantics_mes-0.3.0/uv.lock +2352 -0
- factorysemantics_mes-0.1.2/.env.example +0 -69
- factorysemantics_mes-0.1.2/.github/dependabot.yml +0 -16
- factorysemantics_mes-0.1.2/.github/workflows/ci.yml +0 -55
- factorysemantics_mes-0.1.2/.github/workflows/dco.yml +0 -26
- factorysemantics_mes-0.1.2/.github/workflows/docs.yml +0 -44
- factorysemantics_mes-0.1.2/.github/workflows/release.yml +0 -113
- factorysemantics_mes-0.1.2/.github/workflows/scorecard.yml +0 -28
- factorysemantics_mes-0.1.2/.github/workflows/welcome.yml +0 -23
- factorysemantics_mes-0.1.2/.gitignore +0 -67
- factorysemantics_mes-0.1.2/CHANGELOG.md +0 -76
- factorysemantics_mes-0.1.2/CITATION.cff +0 -12
- factorysemantics_mes-0.1.2/CONTRIBUTING.md +0 -75
- factorysemantics_mes-0.1.2/PKG-INFO +0 -372
- factorysemantics_mes-0.1.2/README.md +0 -118
- factorysemantics_mes-0.1.2/ROADMAP.md +0 -141
- factorysemantics_mes-0.1.2/alembic/env.py +0 -44
- factorysemantics_mes-0.1.2/alembic.ini +0 -4
- factorysemantics_mes-0.1.2/config/tag_map_kepsim.json +0 -97
- factorysemantics_mes-0.1.2/deploy/README.md +0 -68
- factorysemantics_mes-0.1.2/deploy/fsmes-prod-plant@.service +0 -20
- factorysemantics_mes-0.1.2/deploy/promote.sh +0 -89
- factorysemantics_mes-0.1.2/docker/Dockerfile +0 -13
- factorysemantics_mes-0.1.2/docker/docker-compose.yml +0 -111
- factorysemantics_mes-0.1.2/docs/ARCHITECTURE.md +0 -154
- factorysemantics_mes-0.1.2/docs/LANDSCAPE.md +0 -64
- factorysemantics_mes-0.1.2/docs/agents/evals.md +0 -27
- factorysemantics_mes-0.1.2/docs/agents/write-discipline.md +0 -37
- factorysemantics_mes-0.1.2/docs/ai/BUDGET.md +0 -41
- factorysemantics_mes-0.1.2/docs/ai/OBSERVABILITY.md +0 -77
- factorysemantics_mes-0.1.2/docs/decisions/index.md +0 -17
- factorysemantics_mes-0.1.2/docs/design/STYLE.md +0 -64
- factorysemantics_mes-0.1.2/docs/design/backlog/review-station.md +0 -66
- factorysemantics_mes-0.1.2/docs/design/backlog/scrap-reason-codes.md +0 -43
- factorysemantics_mes-0.1.2/docs/develop/index.md +0 -30
- factorysemantics_mes-0.1.2/docs/develop/your-first-module.md +0 -66
- factorysemantics_mes-0.1.2/docs/hooks/generate.py +0 -141
- factorysemantics_mes-0.1.2/docs/index.md +0 -68
- factorysemantics_mes-0.1.2/docs/operate/compatibility.md +0 -20
- factorysemantics_mes-0.1.2/docs/operate/deploy.md +0 -73
- factorysemantics_mes-0.1.2/docs/operate/erpnext.md +0 -57
- factorysemantics_mes-0.1.2/docs/operate/index.md +0 -18
- factorysemantics_mes-0.1.2/docs/operate/registry.md +0 -59
- factorysemantics_mes-0.1.2/docs/plant/first-line.md +0 -63
- factorysemantics_mes-0.1.2/docs/plant/index.md +0 -15
- factorysemantics_mes-0.1.2/docs/plant/never-invent-production.md +0 -66
- factorysemantics_mes-0.1.2/docs/plant/reading-oee.md +0 -46
- factorysemantics_mes-0.1.2/labs/cutlery/README.md +0 -169
- factorysemantics_mes-0.1.2/labs/cutlery/init.py +0 -191
- factorysemantics_mes-0.1.2/labs/cutlery/registry.toml +0 -29
- factorysemantics_mes-0.1.2/labs/cutlery/run_cutlery.py +0 -378
- factorysemantics_mes-0.1.2/labs/erpnext/seed_erpnext.py +0 -328
- factorysemantics_mes-0.1.2/labs/kepsim/line.json +0 -302
- factorysemantics_mes-0.1.2/labs/kepsim/scenario.md +0 -17
- factorysemantics_mes-0.1.2/labs/megafactory/full/surfaces.py +0 -370
- factorysemantics_mes-0.1.2/labs/megafactory/registry.toml +0 -36
- factorysemantics_mes-0.1.2/labs/multiplant/README.md +0 -88
- factorysemantics_mes-0.1.2/labs/multiplant/bottling/init.py +0 -43
- factorysemantics_mes-0.1.2/labs/multiplant/fsplant.ps1 +0 -196
- factorysemantics_mes-0.1.2/labs/multiplant/machining/seed.py +0 -156
- factorysemantics_mes-0.1.2/labs/multiplant/machining/tag_map.json +0 -53
- factorysemantics_mes-0.1.2/labs/multiplant/plants.toml +0 -30
- factorysemantics_mes-0.1.2/mkdocs.yml +0 -128
- factorysemantics_mes-0.1.2/pyproject.toml +0 -136
- factorysemantics_mes-0.1.2/src/fsmes/__init__.py +0 -11
- factorysemantics_mes-0.1.2/src/fsmes/api/app.py +0 -344
- factorysemantics_mes-0.1.2/src/fsmes/api/deps.py +0 -119
- factorysemantics_mes-0.1.2/src/fsmes/api/idempotency.py +0 -77
- factorysemantics_mes-0.1.2/src/fsmes/api/paging.py +0 -59
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/adjustments.py +0 -66
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/admin.py +0 -176
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/analysis.py +0 -78
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/assist.py +0 -255
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/auth.py +0 -86
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/dashboard.py +0 -213
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/design.py +0 -130
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/equipment.py +0 -94
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/execution.py +0 -140
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/kpis.py +0 -37
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/maintenance.py +0 -146
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/masterdata.py +0 -214
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/ops.py +0 -191
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/quality.py +0 -270
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/scheduling.py +0 -92
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/system.py +0 -75
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/triggers.py +0 -96
- factorysemantics_mes-0.1.2/src/fsmes/api/routers/workorders.py +0 -240
- factorysemantics_mes-0.1.2/src/fsmes/cli.py +0 -1152
- factorysemantics_mes-0.1.2/src/fsmes/config.py +0 -133
- factorysemantics_mes-0.1.2/src/fsmes/core/oplock.py +0 -67
- factorysemantics_mes-0.1.2/src/fsmes/db.py +0 -66
- factorysemantics_mes-0.1.2/src/fsmes/demo_feed.py +0 -94
- factorysemantics_mes-0.1.2/src/fsmes/domain/__init__.py +0 -117
- factorysemantics_mes-0.1.2/src/fsmes/domain/audit.py +0 -32
- factorysemantics_mes-0.1.2/src/fsmes/domain/calendar.py +0 -75
- factorysemantics_mes-0.1.2/src/fsmes/domain/common.py +0 -15
- factorysemantics_mes-0.1.2/src/fsmes/domain/equipment.py +0 -44
- factorysemantics_mes-0.1.2/src/fsmes/domain/execution.py +0 -77
- factorysemantics_mes-0.1.2/src/fsmes/domain/gauges.py +0 -73
- factorysemantics_mes-0.1.2/src/fsmes/domain/integration.py +0 -54
- factorysemantics_mes-0.1.2/src/fsmes/domain/maintenance.py +0 -106
- factorysemantics_mes-0.1.2/src/fsmes/domain/masterdata.py +0 -198
- factorysemantics_mes-0.1.2/src/fsmes/domain/quality.py +0 -70
- factorysemantics_mes-0.1.2/src/fsmes/domain/timeseries.py +0 -28
- factorysemantics_mes-0.1.2/src/fsmes/domain/triggers.py +0 -85
- factorysemantics_mes-0.1.2/src/fsmes/domain/workorders.py +0 -100
- factorysemantics_mes-0.1.2/src/fsmes/integrations/erp/b2mml.py +0 -97
- factorysemantics_mes-0.1.2/src/fsmes/integrations/erp/base.py +0 -51
- factorysemantics_mes-0.1.2/src/fsmes/integrations/erp/contract.py +0 -122
- factorysemantics_mes-0.1.2/src/fsmes/integrations/erp/erpnext_adapter.py +0 -282
- factorysemantics_mes-0.1.2/src/fsmes/integrations/erp/file_adapter.py +0 -56
- factorysemantics_mes-0.1.2/src/fsmes/integrations/erp/rest_adapter.py +0 -22
- factorysemantics_mes-0.1.2/src/fsmes/integrations/erp/sync.py +0 -62
- factorysemantics_mes-0.1.2/src/fsmes/integrations/opc/agent.py +0 -859
- factorysemantics_mes-0.1.2/src/fsmes/integrations/opc/csv_replay.py +0 -521
- factorysemantics_mes-0.1.2/src/fsmes/integrations/opc/tag_map.py +0 -198
- factorysemantics_mes-0.1.2/src/fsmes/logging.py +0 -72
- factorysemantics_mes-0.1.2/src/fsmes/mcp/adjustments.py +0 -46
- factorysemantics_mes-0.1.2/src/fsmes/mcp/maintenance.py +0 -96
- factorysemantics_mes-0.1.2/src/fsmes/mcp/masterdata.py +0 -112
- factorysemantics_mes-0.1.2/src/fsmes/mcp/quality.py +0 -84
- factorysemantics_mes-0.1.2/src/fsmes/mcp/scheduling.py +0 -76
- factorysemantics_mes-0.1.2/src/fsmes/mcp/triggers.py +0 -60
- factorysemantics_mes-0.1.2/src/fsmes/mcp_server.py +0 -628
- factorysemantics_mes-0.1.2/src/fsmes/plant.py +0 -557
- factorysemantics_mes-0.1.2/src/fsmes/seed_kepsim.py +0 -184
- factorysemantics_mes-0.1.2/src/fsmes/services/__init__.py +0 -22
- factorysemantics_mes-0.1.2/src/fsmes/services/agent.py +0 -537
- factorysemantics_mes-0.1.2/src/fsmes/services/ai_status.py +0 -292
- factorysemantics_mes-0.1.2/src/fsmes/services/analysis.py +0 -515
- factorysemantics_mes-0.1.2/src/fsmes/services/assistant.py +0 -838
- factorysemantics_mes-0.1.2/src/fsmes/services/audit.py +0 -30
- factorysemantics_mes-0.1.2/src/fsmes/services/auth.py +0 -196
- factorysemantics_mes-0.1.2/src/fsmes/services/calendar.py +0 -204
- factorysemantics_mes-0.1.2/src/fsmes/services/capabilities.py +0 -116
- factorysemantics_mes-0.1.2/src/fsmes/services/coa.py +0 -419
- factorysemantics_mes-0.1.2/src/fsmes/services/design.py +0 -342
- factorysemantics_mes-0.1.2/src/fsmes/services/documents.py +0 -245
- factorysemantics_mes-0.1.2/src/fsmes/services/drafting.py +0 -144
- factorysemantics_mes-0.1.2/src/fsmes/services/equipment.py +0 -236
- factorysemantics_mes-0.1.2/src/fsmes/services/erp.py +0 -224
- factorysemantics_mes-0.1.2/src/fsmes/services/execution.py +0 -302
- factorysemantics_mes-0.1.2/src/fsmes/services/gauges.py +0 -185
- factorysemantics_mes-0.1.2/src/fsmes/services/line.py +0 -364
- factorysemantics_mes-0.1.2/src/fsmes/services/maintenance.py +0 -292
- factorysemantics_mes-0.1.2/src/fsmes/services/masterdata.py +0 -281
- factorysemantics_mes-0.1.2/src/fsmes/services/quality.py +0 -137
- factorysemantics_mes-0.1.2/src/fsmes/services/scheduling.py +0 -275
- factorysemantics_mes-0.1.2/src/fsmes/services/serialization.py +0 -745
- factorysemantics_mes-0.1.2/src/fsmes/services/spc.py +0 -217
- factorysemantics_mes-0.1.2/src/fsmes/services/tags.py +0 -401
- factorysemantics_mes-0.1.2/src/fsmes/services/triggers.py +0 -323
- factorysemantics_mes-0.1.2/src/fsmes/services/walkthroughs.py +0 -128
- factorysemantics_mes-0.1.2/src/fsmes/services/workorders.py +0 -279
- factorysemantics_mes-0.1.2/src/fsmes/sim/__init__.py +0 -17
- factorysemantics_mes-0.1.2/src/fsmes/sim/agent_eval.py +0 -264
- factorysemantics_mes-0.1.2/src/fsmes/sim/autoloop.py +0 -344
- factorysemantics_mes-0.1.2/src/fsmes/sim/generate.py +0 -715
- factorysemantics_mes-0.1.2/src/fsmes/sim/mcp_server.py +0 -440
- factorysemantics_mes-0.1.2/src/fsmes/sim/operations.py +0 -330
- factorysemantics_mes-0.1.2/src/fsmes/sim/runner.py +0 -481
- factorysemantics_mes-0.1.2/src/fsmes/sim/score.py +0 -252
- factorysemantics_mes-0.1.2/src/fsmes/sim/sweep.py +0 -140
- factorysemantics_mes-0.1.2/src/fsmes/sim/triage.py +0 -147
- factorysemantics_mes-0.1.2/src/fsmes/sim/truth.py +0 -131
- factorysemantics_mes-0.1.2/src/fsmes/sim/ui_check.py +0 -355
- factorysemantics_mes-0.1.2/src/fsmes/web/adjustments.html +0 -90
- factorysemantics_mes-0.1.2/src/fsmes/web/adjustments.js +0 -143
- factorysemantics_mes-0.1.2/src/fsmes/web/admin.html +0 -124
- factorysemantics_mes-0.1.2/src/fsmes/web/admin.js +0 -373
- factorysemantics_mes-0.1.2/src/fsmes/web/analysis.css +0 -140
- factorysemantics_mes-0.1.2/src/fsmes/web/analysis.html +0 -113
- factorysemantics_mes-0.1.2/src/fsmes/web/analysis.js +0 -268
- factorysemantics_mes-0.1.2/src/fsmes/web/app.js +0 -556
- factorysemantics_mes-0.1.2/src/fsmes/web/assist.js +0 -694
- factorysemantics_mes-0.1.2/src/fsmes/web/common.js +0 -390
- factorysemantics_mes-0.1.2/src/fsmes/web/design.css +0 -60
- factorysemantics_mes-0.1.2/src/fsmes/web/design.js +0 -215
- factorysemantics_mes-0.1.2/src/fsmes/web/gauges.html +0 -116
- factorysemantics_mes-0.1.2/src/fsmes/web/gauges.js +0 -150
- factorysemantics_mes-0.1.2/src/fsmes/web/index.html +0 -146
- factorysemantics_mes-0.1.2/src/fsmes/web/instructions.html +0 -100
- factorysemantics_mes-0.1.2/src/fsmes/web/instructions.js +0 -309
- factorysemantics_mes-0.1.2/src/fsmes/web/kit.js +0 -176
- factorysemantics_mes-0.1.2/src/fsmes/web/line-page.js +0 -144
- factorysemantics_mes-0.1.2/src/fsmes/web/line.css +0 -234
- factorysemantics_mes-0.1.2/src/fsmes/web/machine.css +0 -88
- factorysemantics_mes-0.1.2/src/fsmes/web/machine.html +0 -145
- factorysemantics_mes-0.1.2/src/fsmes/web/machine.js +0 -309
- factorysemantics_mes-0.1.2/src/fsmes/web/machines.js +0 -137
- factorysemantics_mes-0.1.2/src/fsmes/web/maintenance.html +0 -163
- factorysemantics_mes-0.1.2/src/fsmes/web/maintenance.js +0 -284
- factorysemantics_mes-0.1.2/src/fsmes/web/masterdata.html +0 -200
- factorysemantics_mes-0.1.2/src/fsmes/web/masterdata.js +0 -276
- factorysemantics_mes-0.1.2/src/fsmes/web/ops.js +0 -296
- factorysemantics_mes-0.1.2/src/fsmes/web/orders.css +0 -126
- factorysemantics_mes-0.1.2/src/fsmes/web/orders.html +0 -205
- factorysemantics_mes-0.1.2/src/fsmes/web/orders.js +0 -545
- factorysemantics_mes-0.1.2/src/fsmes/web/quality.css +0 -41
- factorysemantics_mes-0.1.2/src/fsmes/web/quality.html +0 -118
- factorysemantics_mes-0.1.2/src/fsmes/web/quality.js +0 -462
- factorysemantics_mes-0.1.2/src/fsmes/web/schedule.html +0 -130
- factorysemantics_mes-0.1.2/src/fsmes/web/schedule.js +0 -169
- factorysemantics_mes-0.1.2/src/fsmes/web/spc.html +0 -82
- factorysemantics_mes-0.1.2/src/fsmes/web/spc.js +0 -150
- factorysemantics_mes-0.1.2/src/fsmes/web/station.css +0 -88
- factorysemantics_mes-0.1.2/src/fsmes/web/station.html +0 -123
- factorysemantics_mes-0.1.2/src/fsmes/web/station.js +0 -354
- factorysemantics_mes-0.1.2/src/fsmes/web/styles.css +0 -436
- factorysemantics_mes-0.1.2/src/fsmes/web/themes.css +0 -104
- factorysemantics_mes-0.1.2/src/fsmes/web/trace.html +0 -121
- factorysemantics_mes-0.1.2/src/fsmes/web/triggers.html +0 -121
- factorysemantics_mes-0.1.2/src/fsmes/web/triggers.js +0 -175
- factorysemantics_mes-0.1.2/tests/conftest.py +0 -107
- factorysemantics_mes-0.1.2/tests/test_agent.py +0 -333
- factorysemantics_mes-0.1.2/tests/test_agent_batching.py +0 -363
- factorysemantics_mes-0.1.2/tests/test_agent_eval.py +0 -79
- factorysemantics_mes-0.1.2/tests/test_ai_status.py +0 -172
- factorysemantics_mes-0.1.2/tests/test_analysis.py +0 -323
- factorysemantics_mes-0.1.2/tests/test_api.py +0 -77
- factorysemantics_mes-0.1.2/tests/test_assistant.py +0 -204
- factorysemantics_mes-0.1.2/tests/test_auth.py +0 -69
- factorysemantics_mes-0.1.2/tests/test_autoloop.py +0 -170
- factorysemantics_mes-0.1.2/tests/test_capabilities.py +0 -246
- factorysemantics_mes-0.1.2/tests/test_cli.py +0 -27
- factorysemantics_mes-0.1.2/tests/test_coa.py +0 -87
- factorysemantics_mes-0.1.2/tests/test_design.py +0 -178
- factorysemantics_mes-0.1.2/tests/test_environments.py +0 -124
- factorysemantics_mes-0.1.2/tests/test_equipment_oee.py +0 -75
- factorysemantics_mes-0.1.2/tests/test_erp_contract.py +0 -181
- factorysemantics_mes-0.1.2/tests/test_erp_roundtrip.py +0 -58
- factorysemantics_mes-0.1.2/tests/test_erpnext.py +0 -253
- factorysemantics_mes-0.1.2/tests/test_execution.py +0 -50
- factorysemantics_mes-0.1.2/tests/test_file_erp.py +0 -71
- factorysemantics_mes-0.1.2/tests/test_kepsim.py +0 -305
- factorysemantics_mes-0.1.2/tests/test_line_api.py +0 -312
- factorysemantics_mes-0.1.2/tests/test_maintenance.py +0 -252
- factorysemantics_mes-0.1.2/tests/test_mcp_parity.py +0 -89
- factorysemantics_mes-0.1.2/tests/test_mcp_product.py +0 -344
- factorysemantics_mes-0.1.2/tests/test_megafactory.py +0 -159
- factorysemantics_mes-0.1.2/tests/test_migrations_have_one_head.py +0 -18
- factorysemantics_mes-0.1.2/tests/test_plant_migrate.py +0 -85
- factorysemantics_mes-0.1.2/tests/test_plant_scale_lists.py +0 -321
- factorysemantics_mes-0.1.2/tests/test_plant_scale_ui.py +0 -107
- factorysemantics_mes-0.1.2/tests/test_plant_serve_only.py +0 -36
- factorysemantics_mes-0.1.2/tests/test_quality.py +0 -22
- factorysemantics_mes-0.1.2/tests/test_route_coverage.py +0 -95
- factorysemantics_mes-0.1.2/tests/test_routing_depth.py +0 -177
- factorysemantics_mes-0.1.2/tests/test_scale.py +0 -82
- factorysemantics_mes-0.1.2/tests/test_serial_scale.py +0 -332
- factorysemantics_mes-0.1.2/tests/test_sim.py +0 -392
- factorysemantics_mes-0.1.2/tests/test_spc_gauges.py +0 -162
- factorysemantics_mes-0.1.2/tests/test_ui_check.py +0 -153
- factorysemantics_mes-0.1.2/tests/test_walkthroughs.py +0 -152
- factorysemantics_mes-0.1.2/tests/test_web.py +0 -341
- factorysemantics_mes-0.1.2/tests/ui/baselines/control-room.json +0 -976
- factorysemantics_mes-0.1.2/tests/ui/baselines/daylight.json +0 -976
- factorysemantics_mes-0.1.2/tests/ui/baselines/high-contrast.json +0 -976
- factorysemantics_mes-0.1.2/tests/ui/baselines/night-shift.json +0 -976
- factorysemantics_mes-0.1.2/uv.lock +0 -1755
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/.github/CODEOWNERS +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/.github/ISSUE_TEMPLATE/integration.yml +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/.github/ISSUE_TEMPLATE/plant-pack.yml +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/CODE_OF_CONDUCT.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/GOVERNANCE.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/LICENSE +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/MAINTAINERS.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/NOTICE +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/SECURITY.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/config/line_layout.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/config/tag_map.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/config/tag_map_kepware.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/deploy/fsmes-autoloop.service +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/deploy/fsmes-autoloop.timer +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docker/nginx.conf +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/agents/connect-mcp-client.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/agents/index.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/0001-apache-2-with-dco.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/0002-kernel-and-modules.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/0003-one-mcp-server.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/0004-never-invent-production.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/0005-plain-html-no-build-step.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/0006-sqlite-laptop-postgresql-plant.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/0007-fresh-public-history.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/0008-erp-connectors-are-modules.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/decisions/TEMPLATE.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/README.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/analysis-cards-scaling.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/book-output-explicit-order.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/clickable-kpi-tiles.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/opc-integration-suite.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/order-lifecycle-actions.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/orders-creatable-materials.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/orders-supervisor-filters.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/review-orders.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/sixty-machine-plant.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/spc-capability-withheld.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/station-spc.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/station-view.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/supervisor-drill-down.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/design/backlog/ui-style-drift-bc58fb4f8e4d.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/history/private-era.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/onboarding/GUIDE-ENGINEERING.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/onboarding/GUIDE-IT.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/onboarding/README.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/onboarding/worksheet-example.csv +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/onboarding/worksheet-template.csv +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/docs/operate/security.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/analysis/build_notebook.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/analysis/build_report.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/analysis/cutlery_run_analysis.ipynb +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/analysis/viz.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/build_config.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/fill_day.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/line.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/make_tag_map.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/tag_map.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/walkthroughs/install_walkthroughs.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/cutlery/walkthroughs/walkthroughs.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/kepsim/.env.example +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/kepsim/README.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/kepsim/kepware_setup.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/kepsim/setup_dsn.ps1 +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/kepsim/verify_readback.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/build_config.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/full/build_config.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/full/init.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/full/line.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/full/run_full.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/full/seed_breadth.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/full/tag_map.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/init.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/line.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/make_tag_map.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/run_spike.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/seed_breadth.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/megafactory/tag_map.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/labs/multiplant/machining/line.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/api/__init__.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/api/routers/__init__.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/api/routers/coa.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/api/routers/documents.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/api/routers/erp.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/api/routers/line.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/api/routers/serialization.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/core/__init__.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/domain/adjustments.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/domain/documents.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/domain/idempotency.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/domain/scheduling.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/domain/serialization.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/integrations/__init__.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/integrations/erp/__init__.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/integrations/erp/mock_erp.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/integrations/opc/__init__.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/integrations/opc/inspect.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/integrations/opc/security.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/integrations/opc/simulator.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/integrations/opc/worksheet.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/kernel/__init__.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/kernel/common.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/kernel/tags.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/mcp/__init__.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/mcp/coa.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/mcp/equipment.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/mcp/erp.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/mcp/serialization.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/script.py.mako +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/153379d6cf19_merge_cutlery_and_walkthrough_chains.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/18af853fc5c4_initial_schema.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/7c1e5a9d2b4f_serial_sequences.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/9c4d2c836d05_add_user_passwords.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/a1b2c3d4e5f6_agent_identity.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/a1c5e83b7602_calendar_and_scheduling.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/a7c1e93b5f20_roles_as_data.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/a7c2e5d1b9f0_document_kind_steps_needs_walkthroughs.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/b2c3d4e5f6a7_outbox_hardening.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/b3f8d2a41c67_controlled_documents.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/b7d2e9f4a1c3_unit_inspections.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/b8f4d27e1a53_serialisation.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/c2e9b74a3f81_gauges_and_calibration.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/c3d4e5f6a7b8_triggers.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/c4e8f1a2d5b6_serial_units_one_index.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/c9e2a4b71d38_material_at_a_station.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/d4a1c7e5b902_equipment_cost_center.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/d4a7f10c8b52_component_may_enter_twice.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/d4e5f6a7b8c9_recommended_adjustments.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/e5f6a7b8c9d0_tag_values_latest_index.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/e6b3c92d4f17_drop_the_old_bom_constraint.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/e7b3c9d18a45_workorder_work_center.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/f0a1b2c3d4e5_equipment_states_ended_index.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/f2a8d31c6b74_routing_durations.py +0 -0
- {factorysemantics_mes-0.1.2/alembic → factorysemantics_mes-0.3.0/src/fsmes/migrations}/versions/f7d1a58e2c94_preventive_maintenance.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/py.typed +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/seed.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/seed_line.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/services/adjustments.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/services/design_triage.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/services/retention.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/services/staging.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/sim/rollup.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/sim/store.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/admin.css +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/assist-record.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/assist.css +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/coa.css +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/coa.html +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/coa.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/demo/kepsim-hour.json +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/instructions.css +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/line/app.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/line/feed.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/line/flow.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/line/parts.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/line/robot.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/line/scene.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/line.html +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/line3d.html +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/machines.html +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/ops.css +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/ops.html +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/tags.html +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/tags.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/themes.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/trace.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/vendor/OrbitControls.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/vendor/README.md +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/vendor/three.core.min.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/src/fsmes/web/vendor/three.module.min.js +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_adjustments.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_core_oplock.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_cutlery.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_design_triage.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_documents.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_hierarchy.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_hold.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_kernel_common.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_line_scoping.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_onboarding.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_packaged_config.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_paging.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_rollup.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_scheduling_trace.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_store.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_tag_fabric.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_tag_fabric_review.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_tags.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_themes.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_triage.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_triggers.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_washer_story.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_wip.py +0 -0
- {factorysemantics_mes-0.1.2 → factorysemantics_mes-0.3.0}/tests/test_workorders.py +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# What never goes into an image's build context.
|
|
2
|
+
#
|
|
3
|
+
# Every `docker build` here reads this file, and `docker/Dockerfile` copies
|
|
4
|
+
# named paths rather than the whole tree, so this is about the context that is
|
|
5
|
+
# sent to the builder, not about what ends up in the image. Two reasons it is
|
|
6
|
+
# worth having: a plant's own data must never be able to reach a published
|
|
7
|
+
# image by accident, and the generated replay under `labs/multiplant/*/out/` is
|
|
8
|
+
# 9.7 MB for bottling alone - it is generated from the seed in `line.json` on
|
|
9
|
+
# first start and is never shipped.
|
|
10
|
+
#
|
|
11
|
+
# What this excludes:
|
|
12
|
+
#
|
|
13
|
+
# */out/, .data/ generated line data and plant state, written at run
|
|
14
|
+
# time, regenerated from a seed, never shipped
|
|
15
|
+
# *.db, *.sqlite, *-wal a plant's own database, in every spelling the code
|
|
16
|
+
# writes, plus its write-ahead files
|
|
17
|
+
# logs/, *.log a plant's logs
|
|
18
|
+
# .env, *.pem, *.key, credentials and certificates. `.env.*` as well as
|
|
19
|
+
# certs/, .secrets/ `.env`, because an editor's `.env.bak` is a
|
|
20
|
+
# committable copy of a credentials file
|
|
21
|
+
# .venv/, __pycache__/, a developer machine's build leavings, which are for
|
|
22
|
+
# *.egg-info/, .git/ this platform and this interpreter, not the image's
|
|
23
|
+
# lab-results/, evidence from one machine on one day
|
|
24
|
+
# backups/
|
|
25
|
+
#
|
|
26
|
+
# Wholesale rules rather than an enumerated list of directories, for the reason
|
|
27
|
+
# `.gitignore` gives at the same place: an enumerated rule goes stale silently
|
|
28
|
+
# the first time the code writes somewhere new.
|
|
29
|
+
#
|
|
30
|
+
# Nothing here may match a path `docker/Dockerfile` copies, and nothing here
|
|
31
|
+
# may match a path `pyproject.toml` force-includes into the wheel. The day one
|
|
32
|
+
# does, the image loses a plant pack and `pip install` inside it fails - which
|
|
33
|
+
# is what happened on 2026-10-12 for the other reason, and is why
|
|
34
|
+
# `tests/test_the_docker_image_carries_the_packs.py` reads this file too.
|
|
35
|
+
|
|
36
|
+
# Generated line data and plant state
|
|
37
|
+
**/out/
|
|
38
|
+
**/.data/
|
|
39
|
+
lab-results/
|
|
40
|
+
backups/
|
|
41
|
+
|
|
42
|
+
# A plant's own database and logs
|
|
43
|
+
**/*.db
|
|
44
|
+
**/*.db-wal
|
|
45
|
+
**/*.db-shm
|
|
46
|
+
**/*.sqlite
|
|
47
|
+
**/*.sqlite3
|
|
48
|
+
**/*.parquet
|
|
49
|
+
**/logs/
|
|
50
|
+
**/*.log
|
|
51
|
+
|
|
52
|
+
# Credentials and certificates
|
|
53
|
+
.env
|
|
54
|
+
.env.*
|
|
55
|
+
!.env.example
|
|
56
|
+
**/.secrets/
|
|
57
|
+
**/certs/
|
|
58
|
+
**/*.pem
|
|
59
|
+
**/*.key
|
|
60
|
+
**/*.token
|
|
61
|
+
|
|
62
|
+
# This machine's build leavings
|
|
63
|
+
.git/
|
|
64
|
+
.venv/
|
|
65
|
+
venv/
|
|
66
|
+
**/__pycache__/
|
|
67
|
+
**/*.py[cod]
|
|
68
|
+
**/*.egg-info/
|
|
69
|
+
build/
|
|
70
|
+
dist/
|
|
71
|
+
.pytest_cache/
|
|
72
|
+
.ruff_cache/
|
|
73
|
+
.mypy_cache/
|
|
74
|
+
htmlcov/
|
|
75
|
+
.coverage
|
|
76
|
+
site/
|
|
77
|
+
skills-dist/
|
|
78
|
+
*.zip
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# FactorySemantics MES configuration. Copy to .env and adjust; every value has a sane default.
|
|
2
|
+
# All settings are read from environment variables prefixed MES_ (or this file).
|
|
3
|
+
|
|
4
|
+
# --- Database -------------------------------------------------------------
|
|
5
|
+
# SQLite (default, zero-setup):
|
|
6
|
+
MES_DATABASE_URL=sqlite:///fsmes.db
|
|
7
|
+
# PostgreSQL (scale deployment, matches docker-compose):
|
|
8
|
+
# MES_DATABASE_URL=postgresql+psycopg://mes:mes@localhost:5432/mes_twin
|
|
9
|
+
|
|
10
|
+
# --- Which plant is this --------------------------------------------------
|
|
11
|
+
# The shape of this deployment: laptop | plant | fleet. `laptop` is the
|
|
12
|
+
# evaluation profile - `fsmes demo` and the labs - and needs nothing else set
|
|
13
|
+
# here. Anything else refuses to start without a plant name.
|
|
14
|
+
MES_PLANT_PROFILE=laptop
|
|
15
|
+
# What this plant is called. It appears on every screen, in /health, on every
|
|
16
|
+
# metric, in every backup and on every namespace event, so a person looking
|
|
17
|
+
# at two plants can tell which one they are looking at. Letters, digits and
|
|
18
|
+
# _ . : @ = - only: it is published as one segment of the namespace topic.
|
|
19
|
+
# MES_PLANT_NAME=northgate
|
|
20
|
+
# The zone this plant works in, as an IANA name. It decides where a shift
|
|
21
|
+
# starts, when a gauge falls due, and what time every screen shows. Left out,
|
|
22
|
+
# the MES uses this machine's own zone and says "defaulted" wherever it
|
|
23
|
+
# reports it. On Windows the zone database comes from `pip install tzdata`.
|
|
24
|
+
# MES_PLANT_TIMEZONE=America/Chicago
|
|
25
|
+
|
|
26
|
+
# --- Shadow mode ----------------------------------------------------------
|
|
27
|
+
# The MES watches a real plant and can change nothing in it: no PLC
|
|
28
|
+
# write-back, no live ERP, no MQTT publish, nothing about this plant off the
|
|
29
|
+
# box. This is how you run it beside the MES already in charge on a line.
|
|
30
|
+
# Read once at start-up; leaving it is a restart, recorded in the audit
|
|
31
|
+
# trail. With it on, MES_ERP_MODE may only be off or file and MES_UNS_MODE
|
|
32
|
+
# only off or log - anything else refuses to start and says which variable.
|
|
33
|
+
# See docs/operate/shadow-mode.md.
|
|
34
|
+
MES_SHADOW=false
|
|
35
|
+
|
|
36
|
+
# --- Logging --------------------------------------------------------------
|
|
37
|
+
MES_LOG_LEVEL=INFO
|
|
38
|
+
MES_LOG_DIR=logs
|
|
39
|
+
|
|
40
|
+
# --- API ------------------------------------------------------------------
|
|
41
|
+
MES_API_HOST=127.0.0.1
|
|
42
|
+
MES_API_PORT=8000
|
|
43
|
+
|
|
44
|
+
# --- OPC UA ---------------------------------------------------------------
|
|
45
|
+
# Endpoint the agent connects to. Points at the bundled simulator by default;
|
|
46
|
+
# change to your real PLC/gateway endpoint to leave twin mode.
|
|
47
|
+
MES_OPC_ENDPOINT=opc.tcp://127.0.0.1:4840/mes-twin/sim
|
|
48
|
+
MES_OPC_NAMESPACE=urn:mes-twin:sim
|
|
49
|
+
MES_TAG_MAP_FILE=config/tag_map.json
|
|
50
|
+
# The KepSim six-station line instead of the two demo machines:
|
|
51
|
+
# config/tag_map_kepsim.json played back by `fsmes run-opc-sim --replay`
|
|
52
|
+
# config/tag_map_kepware.json read from a real KEPServerEX (see labs/kepsim)
|
|
53
|
+
|
|
54
|
+
# Client security. Empty = anonymous and unencrypted, which is all the bundled
|
|
55
|
+
# simulator needs. A real server usually offers only SignAndEncrypt with a named
|
|
56
|
+
# user — Kepware does. The certificate is minted on first use.
|
|
57
|
+
# MES_OPC_SECURITY=Basic256Sha256,SignAndEncrypt
|
|
58
|
+
# MES_OPC_USER=Administrator
|
|
59
|
+
# MES_OPC_PASSWORD=
|
|
60
|
+
MES_OPC_CERT_DIR=certs
|
|
61
|
+
MES_OPC_APPLICATION_URI=urn:mes-twin:agent
|
|
62
|
+
|
|
63
|
+
# Where `fsmes run-opc-sim --replay` reads the generated KepSim tables from.
|
|
64
|
+
MES_REPLAY_DIR=labs/kepsim/out
|
|
65
|
+
|
|
66
|
+
# --- ERP integration ------------------------------------------------------
|
|
67
|
+
# rest = poll an ERP REST API (mock ERP by default) | file = B2MML-style file
|
|
68
|
+
# exchange via the inbox/outbox folders | erpnext = a real ERPNext/Frappe
|
|
69
|
+
# instance | off = no ERP sync
|
|
70
|
+
MES_ERP_MODE=rest
|
|
71
|
+
MES_ERP_BASE_URL=http://127.0.0.1:8001
|
|
72
|
+
MES_ERP_INBOX=erp_exchange/inbox
|
|
73
|
+
MES_ERP_OUTBOX=erp_exchange/outbox
|
|
74
|
+
MES_ERP_ARCHIVE=erp_exchange/archive
|
|
75
|
+
MES_ERP_POLL_SECONDS=5
|
|
76
|
+
|
|
77
|
+
# --- ERPNext (MES_ERP_MODE=erpnext) ---------------------------------------
|
|
78
|
+
# One bench can serve several sites on one port; the site is chosen by the Host
|
|
79
|
+
# header. Leave MES_ERPNEXT_SITE empty only if the bench serves a single site —
|
|
80
|
+
# on a shared one, the default site is somebody else's company.
|
|
81
|
+
MES_ERPNEXT_BASE_URL=http://localhost:8090
|
|
82
|
+
MES_ERPNEXT_SITE=mes.localhost
|
|
83
|
+
MES_ERPNEXT_USER=Administrator
|
|
84
|
+
MES_ERPNEXT_PASSWORD=admin # the Frappe dev-bench default; a real site uses the API key below
|
|
85
|
+
# Preferred for a long-running worker (ERPNext: User -> API Access -> generate):
|
|
86
|
+
# MES_ERPNEXT_API_KEY=
|
|
87
|
+
# MES_ERPNEXT_API_SECRET=
|
|
88
|
+
# Which company's work orders to import. Empty (the default) imports every
|
|
89
|
+
# company's; a bench serving more than one company must set this.
|
|
90
|
+
# MES_ERPNEXT_COMPANY=Your Company
|
|
91
|
+
# Post finished quantities as real Manufacture stock entries. Off records what
|
|
92
|
+
# the MES counted without moving ERPNext's stock.
|
|
93
|
+
MES_ERPNEXT_POST_STOCK_ENTRY=true
|
|
94
|
+
|
|
95
|
+
# --- Simulator ------------------------------------------------------------
|
|
96
|
+
# >1.0 makes the simulated plant run faster than real time (demo uses 4).
|
|
97
|
+
MES_SIM_SPEED=1.0
|
|
98
|
+
|
|
99
|
+
# --- The judgment model (development build loop only) ---------------------
|
|
100
|
+
# A hosted model asked fixed, typed questions about a simulated run's log,
|
|
101
|
+
# beside the local model's open-ended pass. Nothing in the product asks it
|
|
102
|
+
# anything, and shadow mode refuses the call outright (register: llm.jev).
|
|
103
|
+
# Unset — the normal case — and the run record says it was not asked.
|
|
104
|
+
# The key belongs in this file or the environment, never in the repository.
|
|
105
|
+
# MES_JEV_API_KEY=
|
|
106
|
+
# Pinned, never a moving alias: an answer stored against `-latest` cannot be
|
|
107
|
+
# read again. The version actually served is stored with every answer.
|
|
108
|
+
# `fsmes jev models --resolve` says which concrete version answers today.
|
|
109
|
+
# MES_JEV_MODEL=jev-1.13.0
|
|
110
|
+
# Empty uses the client's own endpoint.
|
|
111
|
+
# MES_JEV_BASE_URL=
|
|
112
|
+
# MES_JEV_TIMEOUT_SECONDS=5.0
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
# Python updates run through the `uv` ecosystem, not `pip`, because this
|
|
4
|
+
# repository has a lockfile and CI requires it to be current.
|
|
5
|
+
#
|
|
6
|
+
# `pip` edits the version constraints in `pyproject.toml` and has no
|
|
7
|
+
# concept of `uv.lock` — it never regenerates it. Since #74 made
|
|
8
|
+
# `uv lock --check` a required check, that combination meant every
|
|
9
|
+
# Python bump Dependabot opened arrived with a stale lock and failed
|
|
10
|
+
# `lockfile` on arrival; #86 (ruff 0.16.7 → 0.16.8) is the one that made
|
|
11
|
+
# it obvious. The `uv` ecosystem reads `pyproject.toml` and `uv.lock`
|
|
12
|
+
# together and writes both in the same commit, so the required check
|
|
13
|
+
# passes without anyone running `uv lock` by hand.
|
|
14
|
+
#
|
|
15
|
+
# The group below is carried over unchanged. It groups on `patterns`,
|
|
16
|
+
# which `uv` supports; the one grouping key `uv` does not support is
|
|
17
|
+
# `dependency-type`, and this repository never used it. `uv` also treats
|
|
18
|
+
# every declared dependency as a production one — it draws no dev/prod
|
|
19
|
+
# line — which changes nothing here, because `patterns: ["*"]` already
|
|
20
|
+
# puts the runtime dependencies and the `dev`, `docs`, `postgres`,
|
|
21
|
+
# `mcp`, `agent`, `mqtt` and `jev` extras in one pull request.
|
|
22
|
+
- package-ecosystem: uv
|
|
23
|
+
directory: /
|
|
24
|
+
schedule:
|
|
25
|
+
interval: weekly
|
|
26
|
+
groups:
|
|
27
|
+
python:
|
|
28
|
+
patterns: ["*"]
|
|
29
|
+
- package-ecosystem: github-actions
|
|
30
|
+
directory: /
|
|
31
|
+
schedule:
|
|
32
|
+
interval: weekly
|
|
33
|
+
groups:
|
|
34
|
+
actions:
|
|
35
|
+
patterns: ["*"]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Prove a built wheel runs the demo, with nothing but the wheel to run it from.
|
|
3
|
+
#
|
|
4
|
+
# 0.1.0 installed cleanly from PyPI and did not work: the wheel carried no
|
|
5
|
+
# config/tag_map.json, so the simulator had no line, nothing was ever booked,
|
|
6
|
+
# and `fsmes demo` exited 0 regardless. The Release Checklist's clean-machine
|
|
7
|
+
# install was the line that would have caught it, and it was skipped for
|
|
8
|
+
# speed. This is that line, automated, so speed cannot skip it.
|
|
9
|
+
#
|
|
10
|
+
# Usage: demo_from_wheel.sh <wheel> [duration-seconds]
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
wheel_arg="${1:?usage: demo_from_wheel.sh <wheel> [duration-seconds]}"
|
|
14
|
+
wheel="$(cd "$(dirname "$wheel_arg")" && pwd)/$(basename "$wheel_arg")"
|
|
15
|
+
# The demo stops watching after this many seconds; it exits as soon as the
|
|
16
|
+
# order completes, so a generous number costs nothing when the wheel is good.
|
|
17
|
+
duration="${2:-300}"
|
|
18
|
+
|
|
19
|
+
# An empty directory containing none of the repository's files. That is the
|
|
20
|
+
# whole point: no config/, no .env, no fsmes.db, no src/ to import instead of
|
|
21
|
+
# the installed package.
|
|
22
|
+
work="$(mktemp -d)"
|
|
23
|
+
trap 'rm -rf "$work"' EXIT
|
|
24
|
+
cd "$work"
|
|
25
|
+
|
|
26
|
+
python -m venv .venv
|
|
27
|
+
.venv/bin/python -m pip install --quiet --upgrade pip
|
|
28
|
+
.venv/bin/python -m pip install --quiet "$wheel"
|
|
29
|
+
# What the wheel says it is, asked two ways: the distribution metadata pip
|
|
30
|
+
# installed, and the answer a user gets from the command line. These were a
|
|
31
|
+
# version apart in 0.1.2 — the metadata said 0.1.2, `fsmes --version` said
|
|
32
|
+
# 0.1.0 — because the number was written down twice. It is written down once
|
|
33
|
+
# now (src/fsmes/__init__.py, which hatchling stamps the metadata from), and
|
|
34
|
+
# this is the line that keeps it that way: a wheel whose two answers disagree
|
|
35
|
+
# never reaches PyPI.
|
|
36
|
+
echo "wheel: $(basename "$wheel")"
|
|
37
|
+
metadata_version="$(.venv/bin/python -c "from importlib.metadata import version; print(version('factorysemantics-mes'))")"
|
|
38
|
+
reported_version="$(.venv/bin/fsmes --version)"
|
|
39
|
+
echo "installed: ${metadata_version}"
|
|
40
|
+
echo "fsmes --version: ${reported_version}"
|
|
41
|
+
if [ "$reported_version" != "fsmes ${metadata_version}" ]; then
|
|
42
|
+
echo "::error::the wheel's metadata says ${metadata_version} but 'fsmes --version' says '${reported_version}'"
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
set +e
|
|
47
|
+
timeout 900 .venv/bin/fsmes demo --duration "$duration" 2>&1 | tee demo.log
|
|
48
|
+
exit_code="${PIPESTATUS[0]}"
|
|
49
|
+
set -e
|
|
50
|
+
|
|
51
|
+
# Two separate questions, and both have to be asked. The exit code only became
|
|
52
|
+
# meaningful when the demo learned to fail; an older wheel exits 0 while
|
|
53
|
+
# booking nothing, and only the output tells you which one you have.
|
|
54
|
+
if [ "$exit_code" -ne 0 ]; then
|
|
55
|
+
echo "::error::fsmes demo exited ${exit_code} from the built wheel"
|
|
56
|
+
exit 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
if ! grep -q "Demo result: full loop closed" demo.log; then
|
|
60
|
+
echo "::error::the wheel installed but the demo never closed its loop"
|
|
61
|
+
exit 1
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
echo "The wheel ran the demo to a closed loop."
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Run the lab's starter experiments and prove each one produced a readable run.
|
|
3
|
+
#
|
|
4
|
+
# The instrument is the thing being tested here, not the plant: an experiment
|
|
5
|
+
# that stops running is an experiment nobody notices has stopped, because it is
|
|
6
|
+
# only ever run by hand. So every starter runs on every pull request, and the
|
|
7
|
+
# check is that the directory it leaves behind holds what the page says it
|
|
8
|
+
# holds - a plan, the truth, what each plant recorded, the scores and a report.
|
|
9
|
+
#
|
|
10
|
+
# It does NOT assert any particular measurement. A scored run is an instrument
|
|
11
|
+
# reading and not a test: withholding a verdict because the runner fell behind
|
|
12
|
+
# is the harness working, and failing CI on it would teach everyone to stop
|
|
13
|
+
# reading the number. What fails this script is a run that did not happen.
|
|
14
|
+
#
|
|
15
|
+
# Usage: lab_starters.sh [plan ...] (default: every plan in labs/experiments)
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
plans=("$@")
|
|
19
|
+
if [ ${#plans[@]} -eq 0 ]; then
|
|
20
|
+
mapfile -t plans < <(ls labs/experiments/*.toml)
|
|
21
|
+
fi
|
|
22
|
+
|
|
23
|
+
results="$(pwd)/lab-results"
|
|
24
|
+
rm -rf "$results"
|
|
25
|
+
|
|
26
|
+
# The design store this run's plants and notes use. Pointed at the results
|
|
27
|
+
# directory so a scripted run proves the feedback loop without writing into
|
|
28
|
+
# anybody's real notes, and so the store travels with the runs as an artifact.
|
|
29
|
+
export MES_DESIGN_STORE="$results/design.db"
|
|
30
|
+
mkdir -p "$results"
|
|
31
|
+
|
|
32
|
+
for plan in "${plans[@]}"; do
|
|
33
|
+
echo "::group::fsmes lab run $plan"
|
|
34
|
+
fsmes lab run "$plan" --results "$results"
|
|
35
|
+
echo "::endgroup::"
|
|
36
|
+
done
|
|
37
|
+
|
|
38
|
+
fsmes lab list --results "$results"
|
|
39
|
+
|
|
40
|
+
# The feedback loop, end to end and with no model anywhere: a note left
|
|
41
|
+
# against a run appears in that run's report beside the screen it names, and
|
|
42
|
+
# `fsmes lab review` rolls every run up into one cited findings.md.
|
|
43
|
+
# The note is left against a run that measured `booking`, because the check
|
|
44
|
+
# below is that it renders *beside the booking numbers* - a run whose plan
|
|
45
|
+
# asked for other measurements has no such section for it to sit beside, and
|
|
46
|
+
# asserting against one is a check about which starter happens to sort first.
|
|
47
|
+
first_run="$(python - "$results" <<'PICK'
|
|
48
|
+
import json
|
|
49
|
+
import sys
|
|
50
|
+
from pathlib import Path
|
|
51
|
+
|
|
52
|
+
for run in sorted(p for p in Path(sys.argv[1]).iterdir() if (p / "scores.json").is_file()):
|
|
53
|
+
scores = json.loads((run / "scores.json").read_text(encoding="utf-8"))
|
|
54
|
+
if "booking" in scores.get("measurements_asked_for", []):
|
|
55
|
+
print(run)
|
|
56
|
+
break
|
|
57
|
+
else:
|
|
58
|
+
sys.exit("no run measured booking, so the feedback check has nothing to sit beside.")
|
|
59
|
+
PICK
|
|
60
|
+
)/"
|
|
61
|
+
plant="$(python -c "import json,sys; print(json.load(open(sys.argv[1]))['plants'][0]['plant'])" \
|
|
62
|
+
"${first_run}scores.json")"
|
|
63
|
+
note="the orders list does not say how many orders there are"
|
|
64
|
+
fsmes lab note "${first_run%/}" "$note" --screen /dashboard/orders --plant "$plant"
|
|
65
|
+
fsmes lab review --results "$results" --no-model --out "$results/findings.md"
|
|
66
|
+
|
|
67
|
+
python - "$results" "${#plans[@]}" "$note" <<'PY'
|
|
68
|
+
import json
|
|
69
|
+
import os
|
|
70
|
+
import sys
|
|
71
|
+
from pathlib import Path
|
|
72
|
+
|
|
73
|
+
results, expected, note = Path(sys.argv[1]), int(sys.argv[2]), sys.argv[3]
|
|
74
|
+
runs = sorted(p for p in results.iterdir() if (p / "scores.json").is_file())
|
|
75
|
+
if len(runs) != expected:
|
|
76
|
+
sys.exit(f"{expected} plan(s) ran and {len(runs)} run directory(ies) appeared in {results}.")
|
|
77
|
+
|
|
78
|
+
summary = ["| Run | Plants | Withheld | Measurements |", "|---|---|---|---|"]
|
|
79
|
+
for run in runs:
|
|
80
|
+
scores = json.loads((run / "scores.json").read_text(encoding="utf-8"))
|
|
81
|
+
missing = [name for name in ("plan.toml", "truth.json", "scores.json",
|
|
82
|
+
"report.html", "notes.md", "recorded",
|
|
83
|
+
"feedback/conversations.jsonl")
|
|
84
|
+
if not (run / name).exists()]
|
|
85
|
+
if missing:
|
|
86
|
+
sys.exit(f"{run.name} is missing {', '.join(missing)}.")
|
|
87
|
+
if scores["plants_run"] != scores["plants_total"]:
|
|
88
|
+
sys.exit(f"{run.name}: {scores['plants_run']} of {scores['plants_total']} plants ran.")
|
|
89
|
+
# A measurement is either about one plant or about the run. Both count;
|
|
90
|
+
# what does not count is a plan asking for one and the directory holding
|
|
91
|
+
# neither, which is how a report comes to say less than it was asked for.
|
|
92
|
+
run_wide = scores.get("measurements") or {}
|
|
93
|
+
for name in scores["measurements_asked_for"]:
|
|
94
|
+
if name in run_wide:
|
|
95
|
+
continue
|
|
96
|
+
for plant in scores["plants"]:
|
|
97
|
+
if name not in plant["measurements"]:
|
|
98
|
+
sys.exit(f"{run.name}: {plant['plant']} has no {name} measurement, and the plan "
|
|
99
|
+
f"asked for one.")
|
|
100
|
+
page = (run / "report.html").read_text(encoding="utf-8")
|
|
101
|
+
if "http://" in page or "https://" in page:
|
|
102
|
+
sys.exit(f"{run.name}: report.html fetches something from the network. A results "
|
|
103
|
+
f"directory has to open on a machine that has none.")
|
|
104
|
+
withheld = sum(1 for p in scores["plants"] if p["verdict_withheld"])
|
|
105
|
+
summary.append(f"| {run.name} | {scores['plants_run']} | {withheld} | "
|
|
106
|
+
f"{', '.join(scores['measurements_asked_for'])} |")
|
|
107
|
+
print(f"{run.name}: {scores['plants_run']} plant(s), {withheld} verdict(s) withheld")
|
|
108
|
+
|
|
109
|
+
# The note went to the first run that measured booking; it has to be in that
|
|
110
|
+
# run's report, under the section for the screen it names rather than in an
|
|
111
|
+
# appendix somewhere.
|
|
112
|
+
first = next(run for run in runs
|
|
113
|
+
if "booking" in json.loads(
|
|
114
|
+
(run / "scores.json").read_text(encoding="utf-8")
|
|
115
|
+
).get("measurements_asked_for", []))
|
|
116
|
+
page = (first / "report.html").read_text(encoding="utf-8")
|
|
117
|
+
if note not in page:
|
|
118
|
+
sys.exit(f"{first.name}: the note left with `fsmes lab note` is not in report.html.")
|
|
119
|
+
if page.index("Booking honesty") > page.index(note):
|
|
120
|
+
sys.exit(f"{first.name}: the note is not rendered beside the booking numbers it is about.")
|
|
121
|
+
|
|
122
|
+
findings = results / "findings.md"
|
|
123
|
+
if not findings.is_file():
|
|
124
|
+
sys.exit("`fsmes lab review` wrote no findings.md.")
|
|
125
|
+
rolled = findings.read_text(encoding="utf-8")
|
|
126
|
+
for run in runs:
|
|
127
|
+
if run.name not in rolled:
|
|
128
|
+
sys.exit(f"findings.md does not cite {run.name}.")
|
|
129
|
+
if f"> {note}" not in rolled:
|
|
130
|
+
sys.exit("findings.md does not quote the note verbatim.")
|
|
131
|
+
print(f"feedback: the note is in {first.name}'s report and findings.md cites "
|
|
132
|
+
f"{len(runs)} run(s)")
|
|
133
|
+
|
|
134
|
+
step = os.environ.get("GITHUB_STEP_SUMMARY")
|
|
135
|
+
if step:
|
|
136
|
+
with Path(step).open("a", encoding="utf-8") as handle:
|
|
137
|
+
handle.write("\n".join(summary) + "\n")
|
|
138
|
+
PY
|