diff --git a/.claude/skills/graphics/SKILL.md b/.claude/skills/graphics/SKILL.md
index 61e3bee..4ff3909 100644
--- a/.claude/skills/graphics/SKILL.md
+++ b/.claude/skills/graphics/SKILL.md
@@ -1,15 +1,18 @@
---
name: graphics
description: >-
- CI Server R1.03 operator graphics: displays, symbols, layouts and HTML displays. Use when the
+ CI Server R1.03 operator graphics for the Operator Interface (desktop) and the HTML display
+ (web): displays, symbols, layouts. Use when the
user wants to create or change a display or symbol in the Edit Module (number field, text,
alarm overview, trend, buttons, actions, parameters, connecting a component to an item),
deploy or remove display files, export displays to HTML / Mobile Operator, open a display in a
web browser (localhost:8080/mobileoperator), validate, search or unlock displays (jwuiutl,
.lck files), find where displays, symbols and layouts are stored (DEPLOY folder,
- Layouts.xml), change layouts, menus, toolbars or frames, build dataset forms (*Dia.xml), or
+ Layouts.xml), create or change layouts (operator window, navigation frame, main frame, alarm
+ banner, popup / faceplate window, kiosk or full-screen screen, menus, toolbars, status line,
+ frames, tabs, open a display in a frame or another layout), build dataset forms (*Dia.xml), or
use the AOG library (Advanced Operating Graphics, AOG_Style, AOG symbols, faceplates). Sources
- IM 36K10C50-01EN, IM 36K10R30-01EN, IM 36K10C60-01EN.
+ IM 36K10C50-01EN, IM 36K10R30-01EN, IM 36K10C60-01EN and the installed Layouts.readme.
---
# Graphics: displays, symbols, layouts (R1.03)
@@ -27,13 +30,17 @@ Rules:
Reloading the browser page logs out — use the display menu *View > Reload*, and the display
box to open other displays.
- `jwuiutl -vf`, `-u`, `-c`, `-a` rewrite or unlock files of **all** displays: only with approval.
+- Ask the user to close the Edit Module before CI Server is stopped or restarted: otherwise the
+ next start fails (skill `system-check`, §3).
+- The Operator Interface (desktop) reads `Layouts.xml` only at start: after layout changes,
+ restart it (a running client falls back to the current window and just reloads the display).
| Task | File | Status |
|---|---|---|
| Build a display in the Edit Module (text, number field, alarm overview, trend) and check the saved XML | `tasks/create-display.md` | verified |
| Deploy / remove display files, export HTML, validate and search with `jwuiutl` | `tasks/deploy-displays.md` | verified |
| Open and check a display in the browser (HTML display / Mobile Operator) | `tasks/deploy-displays.md` §4 | verified |
-| Layouts (`Layouts.xml`), menus, toolbars, frames, dual screen | R30 summary §2 | from docs |
+| Operator layouts (`Layouts.xml`): windows, menus, toolbars, frames, popups, kiosk screens; open displays in frames and layouts | `tasks/layouts.md` | verified (dual screen, per-user layout from docs) |
| Dataset forms (`*Dia.xml`) and the form description language | R30 summary §3 | from docs |
| Symbols, parameters, actions, localisation, record/playback | C50 summary §1, §4, §5 | from docs |
| AOG library (styles, symbols, faceplates, templates) | C60 summary | from docs |
diff --git a/.claude/skills/graphics/tasks/layouts.md b/.claude/skills/graphics/tasks/layouts.md
new file mode 100644
index 0000000..bd84314
--- /dev/null
+++ b/.claude/skills/graphics/tasks/layouts.md
@@ -0,0 +1,122 @@
+---
+task: Configure operator layouts (Layouts.xml): windows, menus, toolbars, frames, popups; open displays in frames and layouts
+version: R1.03
+source: Layouts.readme (installed, %TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\layouts); IM 36K10R30-01EN §1, §4.7; IM 36K10C50-01EN §4.12; practiced with CI-Eng-Sample (layout CIENG_Operator) in the Operator Interface (desktop) and the HTML display 2026-10-01
+status: verified
+---
+
+# Operator layouts
+
+A **layout** is a window of the Operator Interface: optional menu and toolbars, a **frame set**
+(required) holding displays, and a status line. All layouts of a deployment are in one file,
+`%TLS_WAP_PATH%\cfg\operatorInterfaces\DEPLOY\layouts\Layouts.xml`, used by **both** the
+Operator Interface (desktop) and the HTML display (web). The complete option and command
+reference is `Layouts.readme` in the same folder; `Layouts-original.xml` is the factory copy.
+
+## 1. Rules
+
+- `Layouts.xml` is shared by every operator: back it up and change it only with the user's
+ approval. Keep project layouts in a marked block so they can be removed cleanly (sample:
+ `examples/CI-Eng-Sample/layouts/layout.ps1` + `CIENG_Operator.xml`; the script checks the XML
+ is well-formed, keeps UTF-8 without BOM and CRLF, and `-Remove` restores the file byte for byte).
+- **The Operator Interface reads `Layouts.xml` only when it starts.** After a change, close and
+ restart it. A running client does not know a new layout: opening a display in it only reloads
+ the current window ("blink"). The Edit Module also needs a restart to offer the new name in
+ the *Open display* action.
+- Name the main frame **`default`**: the factory and AOG displays (alarm lists, faceplates,
+ toolbar commands) open their targets in a frame called `default`.
+
+## 2. Structure
+
+```xml
+
+
+ …
+
+
+
+
+
+
+
+ …
+
+```
+
+- `title`: `$` = title of the display in that frame (verified: *CI-Eng-Sample - Current
+ Alarm Overview*).
+- Window: `initialPosition` (`centreScreen`, `atCursor`, `pixelsScreen2`, `centreLayout`, …),
+ `initialSize` (`pixels`, `screenSize`, `desktopSize`, `fitFrames`), `maximumOpen`, `modal`,
+ `alwaysOnTop`, print options.
+- Frame sets: `rows` / `cols` with pixels, `n*` fractions or `fitDisplay`; nest freely; a ``
+ holds several frames as tabs (`tabPosition`, `maximumTabs`, `closeTabAllowed`). Frame options:
+ `name`, `initialDisplay` (= home display), `stackSize` (back/forward history), `zoom`
+ (`fitDisplay`, `stretchDisplay`, `%`), `zoomingAllowed`, `scrollingAllowed`, `borderStyle`.
+- Menu (max. two levels; `type` normal/check/radio/sub; `mnemonic`, `accelerator` like `F5`,
+ `CONTROL P`) and toolbar items (`icon` from the factory set such as `ciNavLeft32.png`,
+ `ciProAlar32.png`, `ciZoomFull32.png`; `type` combo/editableCombo/dropdownList) run commands:
+
+| Command | Effect |
+|---|---|
+| `navigate to [] [
=;…]` | Open a display in a frame (with parameters) |
+| `navigate back/forward/up/home/history ` | Frame history (`$` in the tooltip = target name) |
+| `reload ` / `reload all` | Reload displays (keeps the session in the HTML display) |
+| `zoom ` | 0 = fit, 1 = 100 %, 10–1000 = relative % |
+| `toggleSize fullScreen [n]` / `toggleSize x,y,WxH` | Full screen / given size and back |
+| `print frame|frameWithSetup|preview|setup|selectFrame` | Printing (desktop only) |
+| `login`, `logout`, `exit`, `toolbar`, `statusline`, `playback record|view`, `shell client|server `, `lookfeel `, `help` | |
+
+ The installed status line also uses item types `displayName`, `playbackIndicator` and
+ `dateTime`, which the readme does not list (ISS-042).
+- `` blocks translate labels per locale (key = item name + `.label`).
+
+## 3. Opening displays in frames and layouts
+
+| From | How |
+|---|---|
+| Button / component (Edit Module, *Actions* sheet → *Open display*) | Display, **Layout** (empty = current window), **Frame**, parameters; stored as `` with ``, ``, ``, `` |
+| Menu / toolbar | `navigate to ` (current window only) |
+| Login | User profile *Layout* and *Initial display* (Engineering Module, Authorization > Users); empty layout = `default` (from docs; not changed on the test system) |
+| HTML display | URL `?d=&l=` |
+| Script on a component | *Execute command* with `ACTION `, e.g. `ACTION toggleSize 50,50,710x520` |
+
+Verified behaviour (desktop): a button with layout `CIENG_Operator` opened a **second window**
+(1600 × 900, own menu/toolbar/frames); buttons without layout opened their display in the main
+frame of the current window; **Back** returned. A button with layout `popup` opened a separate
+window: always on top, only a close button, sized to the display (`fitFrames`), and minimised
+together with the window that opened it — use popups only for small displays (faceplates,
+setpoint dialogs).
+
+## 4. Typical project layouts
+
+- **Operator main window**: navigation frame + main frame `default` (+ tabs) + alarm banner,
+ project menu/toolbar, assigned to operators via the user profile *Layout*.
+- **Kiosk / control-room screen**: `drawBorder="false"`, `alwaysOnTop="true"`,
+ `initialSize="screenSize"`, `closingAllowed="false"`, `minimizingAllowed="false"`.
+ `toggleSize fullScreen` covers the taskbar only when `alwaysOnTop="true"` (verified: with
+ `false` the title bar and taskbar stay).
+- **Popups / faceplates**: small layout with one frame `default`, `initialSize="fitFrames"`,
+ `initialPosition="atCursor"`, `alwaysOnTop="true"`, `maximumOpen` > 1 for several faceplates
+ (factory: `popup`, `FixedPopup`, `ResizablePopup`, `faceplate`, `tuningpanel`, `Setpoint`,
+ `SelectMode`).
+- **Several screens**: one layout per screen with `initialPosition="pixelsScreen2"` /
+ `centreScreen2`, or the dual-screen pattern of IM 36K10R30 §1.10.
+
+## 5. HTML display differences
+
+The browser window is the main layout (its size and window options are ignored); other layouts
+open as windows inside the page; print, look-and-feel and the debug key are not supported; pick
+the layout with `&l=`. Verified: `?d=CIENG_Tank&l=CIENG_Operator` showed the sample menu,
+toolbar, navigation frame and banner.
+
+## Verified (CI-Eng-Sample, 2026-10-01)
+
+`layout.ps1` add / remove / add (removal identical to the original, backup kept); Operator
+Interface restart required before the layout was found; desktop and web windows as described
+above; F11 (`toggleSize fullScreen`) worked within the taskbar limits; after restarting the
+Operator Interface the main window still used the factory `default` layout (Admin profile
+unchanged).
diff --git a/.claude/skills/system-check/SKILL.md b/.claude/skills/system-check/SKILL.md
index 98dddef..c2a15c8 100644
--- a/.claude/skills/system-check/SKILL.md
+++ b/.claude/skills/system-check/SKILL.md
@@ -83,6 +83,14 @@ prompt. Setup files (`*.sup`) are plain text (CRLF); edit them with the Setup Fi
(observed 2026-10-01: a run started 17:25 ran out at 09:52 the next morning after a sleep);
some processes (e.g. `umh`) stay attached, but `dssqld`/`itmval` fail and the log shows
`ISF-F-LIC_PROB, DATABASE Service is not licensed`.
+- **Close the Edit Module (and Engineering Module) before stopping CI Server.** A local Edit
+ Module is attached to the BUS Service (`JWUIGED`, a `java.exe` in the user's session) and
+ does not stop with the service. The next start then aborts at once; `%TLS_LOG_PATH%\ci_start.log`
+ shows `CI Server is already running` / `umh_panic: durwfp, CI Server has not been properly
+ stopped, kill the following processes …` with the list (seen 2026-10-01: `JWUIGED12760` kept
+ UMH, DURTIM, UMHLOG … listed). Fix: close the Edit Module (or end that `java.exe`), then start
+ again. Avoid `durstp -k -p *` unless the user approves. The Operator Interface (desktop) and the
+ HTML display connect through the web server and were not in the list.
## 4. Time synchronization
diff --git a/examples/CI-Eng-Sample/README.md b/examples/CI-Eng-Sample/README.md
index 79861a1..146dc5e 100644
--- a/examples/CI-Eng-Sample/README.md
+++ b/examples/CI-Eng-Sample/README.md
@@ -1,173 +1,187 @@
-# CI-Eng-Sample
-
-A small, invented sample project that anyone with this repo can load into a CI Server
-**R1.03** test system. Skills use its names in their examples, and every skill task is
-re-tested against it so that no other project is needed.
-
-Built and tested on CI Server R1.03.00 (unlicensed test system), 2026-09-30.
-
-## Load and remove
-
-Test systems only: loading writes to the CI Server database. CI Server must be running.
-From an elevated prompt, call the scripts by full path (a bare `load.cmd` may not be found
-from the current folder):
-
-```
-cmd /c "\examples\CI-Eng-Sample\load.cmd"
-cmd /c "\examples\CI-Eng-Sample\remove.cmd"
-```
-
-- Each step prints a summary and writes a `.qlo` listing; check that `Errors` is 0.
-- **Restart CI Server after loading** (stop, then start the CI Service): a new storage group
- stores no history until CI Server restarts.
-- `load.cmd` on a system that already has the project reports `Exists` and changes nothing.
-- `remove.cmd` takes about 1½ minutes: a storage group can only be deleted after its stop time
- has passed, so the script sets a stop time one minute ahead and waits. Removing the group
- also deletes its history.
-
-## Current contents
-
-| Name | Kind | Details |
-|---|---|---|
-| `CI-Eng-Sample` | Section | Top level |
-| `CI-Eng-Sample.TANK1`, `.PUMP1`, `.SYSTEM` | Sections | Tank, pump, system monitoring |
-| `CI-Eng-Sample.TANK1.LEVEL` | Item, Real | %, format `999.9`, limits LL 10 / L 20 / H 80 / HH 90, scale 0–100, stored in `CIENG_EVENT`; alarming on (ack type `CIENG_ACK`, area `CIENG_TANKS`; `16_item_alarm_df.qli`) |
-| `CI-Eng-Sample.TANK1.INFLOW` | Item, Real | m3/h, format `9999.9`, scale 0–500, stored in `CIENG_EVENT` |
-| `CI-Eng-Sample.PUMP1.RUNNING` | Item, Boolean | |
-| `CI-Eng-Sample.PUMP1.MODE` | Item, Integer | 0 manual, 1 auto |
-| `CI-Eng-Sample.SYSTEM.CPU_LOAD` | Item, Real | Target for `intcpumon` |
-| `CI-Eng-Sample.SYSTEM.DISK_C` | Item, Real | Target for `intdskmon` (reports **used** %) |
-| `CI-Eng-Sample.SYSTEM.PING_LOCALHOST` | Item, Integer | Target for `inttcpmon` (1 = reachable) |
-| `CI-Eng-Sample.SYSTEM.PROC_ALM` | Item, Integer | Target for `intmon` (1 = `alm` process running) |
-| `CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS` | Sub-item, Integrator | Running time in seconds (adds value × integration granule, `itm_int_secs` in `itm.sup`, default 1 s) |
-| `CI-Eng-Sample.TANK1.LEVEL.MAX` | Sub-item, Min-Max | Highest level seen |
-| `CI-Eng-Sample.DEMO` | Section | Tutorial examples |
-| `CI-Eng-Sample.DEMO.COUNTER` | Item, Integer | Counts 1…100, one step per second, written by `DEMO.INCR1` |
-| `CIENG_1S` | Trigger group | Every second |
-| `CIENG_INCR` | Class (traditional) | Increments `DEMO.COUNTER`, wraps at 100; compiled on load |
-| `CI-Eng-Sample.DEMO.INCR1` | Object | Instance of `CIENG_INCR` |
-| `CI-Eng-Sample.TEMPLATES` | Section | Template items for classes |
-| `CI-Eng-Sample.TEMPLATES.TPL_REAL` | Item, Real | Template for items that objects create (format `9999.9`, scale 0–1000) |
-| `CIENG_TANK` | Class (traditional) | Prompt *Tank capacity (m3)*; signal `LEVEL` = `