- Stamp the origin press (machine) number on every cart across the line:
on-the-way, in-oven, finished tiles, and the finished by-order list.
New shared PressTag.vue badge (icon-free, ink/white text on a violet box).
- Thread `press` through the payload (CartOnWay/OvenBatch/FinishedCart/
FinishedByOrder) — backend derives distinct press(es) per cart/order.
- Header: pill now "Temperprozess" (was PressV); "Live-Uebersicht" moved into
the blue accent slot; dropped the duplicate subtitle.
- Fuse the header bar and flow legend into one denser two-row panel (flat
prop on both + a shared .toppanel wrapper).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
With ?embed=grafana on the URL the board hides its in-page range picker and drives the finished-figures window from Grafana's exact from/to (epoch ms) instead of a preset. Backend /overview now accepts from/to (aliased) via FROM_UNIXTIME, which resolves in the same DB session clock as NOW() so timezone handling is unchanged. Standalone behaviour (own picker + preset range) is untouched. Includes rebuilt dist.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
press_settings.presses and settings.downtime_reasons are re-read on every 12s
overview poll; route them through the kernel cached_select() TTL cache so they
stop consuming a shared-pool checkout each poll. Part of the gateway
connection-pool-saturation fix (see fastAPI/agent_docs/db-pool-relief.md).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the sample-data scaffold with real SQL, un-scoped across all
presses and scoped to one plant (PLANT_NAME env, default Cadolzburg).
- api/routes.py: press list from press_settings.presses; per-press
good/chips from active_orders + rejects; run/stop/idle by cycle
recency (cycles_new); stop note from downtimes + downtime_reasons;
on-way / in-oven / finished carts + nicht-verladen from
temper_tracking (live position derived IN SQL from planned times vs
NOW(); reprint rows excluded so carts never double-count). Thin
_fetch_* helpers (degrade to empty, never 500) + a pure _build_payload.
- Oven temperature omitted (no sensor feed): ovenTempC optional in the
type, °C chip hidden in OvenBand.vue, coerced in ProductionLine.vue.
- Rebuilt dist/.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Vue 3 + Vite 8 + TS + PrimeVue 4 (Nora/Industrial) + Pinia + vue-i18n SPA, served
by the SPRO gateway as a static page-module under /module/temper_overview and
embedded into Grafana via iframe.
- Ports the LOCKED design #4 "Shop-floor Schematic": one connected line
Pressen -> (cyan) -> Ofen -> (green) -> Fertig; carts under their origin press;
oven trays as dwell-progress bars; finished band; range picker scoping only the
Fertig figures. Flow/order colours match PressV (fleet recognisability).
- Python page-module wrapper: register(app) mounts committed dist/ + a no-auth
read API (GET /api/overview). Kernel DB seam in _db.py.
- Backend returns SAMPLE data; frontend falls back to bundled sample so `npm run
dev` renders with zero backend (TODO markers point at the real temper aggregates).
- Rich README bakes in the design, contract, wiring + Grafana embedding for
standalone development.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>