Compare commits

..

No commits in common. "4872186f133dbb6955e003aa9542d19eb0ca3ef9" and "ce5203ec4a5c77b2859016e362ee1cf951f6f200" have entirely different histories.

4 changed files with 6 additions and 132 deletions

View file

@ -41,7 +41,7 @@ Rules:
| Deploy / remove display files, export HTML, validate and search with `jwuiutl` | `tasks/deploy-displays.md` | verified | | Deploy / remove display files, export HTML, validate and search with `jwuiutl` | `tasks/deploy-displays.md` | verified |
| Trend: pen sources (history group, aggregates), every pen and chart setting, desktop vs HTML display, 50-pen web workaround (`add_trend_spares.ps1`), Micro Trend | `tasks/trend.md` | verified (desktop); web workaround verified; Micro Trend open (ISS-055) | | Trend: pen sources (history group, aggregates), every pen and chart setting, desktop vs HTML display, 50-pen web workaround (`add_trend_spares.ps1`), Micro Trend | `tasks/trend.md` | verified (desktop); web workaround verified; Micro Trend open (ISS-055) |
| Open and check a display in the browser (HTML display / Mobile Operator) | `tasks/deploy-displays.md` §4 | verified | | Open and check a display in the browser (HTML display / Mobile Operator) | `tasks/deploy-displays.md` §4 | verified |
| Operator layouts (`Layouts.xml`): windows, menus, toolbars, frames, popups, kiosk screens; open displays in frames and layouts; every parameter and command, desktop vs web (§6) | `tasks/layouts.md` | verified (dual screen, per-user layout 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 | | 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 | | Symbols, parameters, actions, localisation, record/playback | C50 summary §1, §4, §5 | from docs |
| AOG library (styles, symbols, faceplates, templates) | C60 summary | from docs | | AOG library (styles, symbols, faceplates, templates) | C60 summary | from docs |

View file

@ -1,8 +1,8 @@
--- ---
task: Configure operator layouts (Layouts.xml): windows, menus, toolbars, frames, popups; open displays in frames and layouts task: Configure operator layouts (Layouts.xml): windows, menus, toolbars, frames, popups; open displays in frames and layouts
version: R1.03 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; parameter-by-parameter test (§6) on both clients 2026-10-02, web behaviour also read from the installed web client code (mobileoperator fasttools.min.js) 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 (parameters tested on desktop and web 2026-10-02 except print orientation/margins, playback, multi-screen positions and the maximumTabs limit for new tabs) status: verified
--- ---
# Operator layouts # Operator layouts
@ -24,14 +24,7 @@ reference is `Layouts.readme` in the same folder; `Layouts-original.xml` is the
the current window ("blink"). The Edit Module also needs a restart to offer the new name in the current window ("blink"). The Edit Module also needs a restart to offer the new name in
the *Open display* action. the *Open display* action.
- Name the main frame **`default`**: the factory and AOG displays (alarm lists, faceplates, - Name the main frame **`default`**: the factory and AOG displays (alarm lists, faceplates,
toolbar commands) open their targets in a frame called `default`. At login the user profile's toolbar commands) open their targets in a frame called `default`.
*Initial display* replaces the `initialDisplay` of frame `default` (desktop; web: `?d=`).
- Layouts used by **both** clients must have the web-compatible shape (§6.1): per frame set at
most one `n*` division, and at most one nested frame set, placed in that `n*` slot. Always
set `title` and `drawBorder`.
- Menu items whose command has an on/off state (`toolbar`, `statusline`, `playback record`)
**must** be `type="check"`: otherwise the Operator Interface fails at start
(`ClassCastException … JCheckBoxMenuItem`).
## 2. Structure ## 2. Structure
@ -59,8 +52,7 @@ reference is `Layouts.readme` in the same folder; `Layouts-original.xml` is the
- Window: `initialPosition` (`centreScreen`, `atCursor`, `pixelsScreen2`, `centreLayout`, …), - Window: `initialPosition` (`centreScreen`, `atCursor`, `pixelsScreen2`, `centreLayout`, …),
`initialSize` (`pixels`, `screenSize`, `desktopSize`, `fitFrames`), `maximumOpen`, `modal`, `initialSize` (`pixels`, `screenSize`, `desktopSize`, `fitFrames`), `maximumOpen`, `modal`,
`alwaysOnTop`, print options. `alwaysOnTop`, print options.
- Frame sets: `rows` / `cols` with pixels, `n*` or `fitDisplay` (fractions are not honoured and - Frame sets: `rows` / `cols` with pixels, `n*` fractions or `fitDisplay`; nest freely; a `<tab>`
the web client limits nesting: §6.1); a `<tab>`
holds several frames as tabs (`tabPosition`, `maximumTabs`, `closeTabAllowed`). Frame options: holds several frames as tabs (`tabPosition`, `maximumTabs`, `closeTabAllowed`). Frame options:
`name`, `initialDisplay` (= home display), `stackSize` (back/forward history), `zoom` `name`, `initialDisplay` (= home display), `stackSize` (back/forward history), `zoom`
(`fitDisplay`, `stretchDisplay`, `<n>%`), `zoomingAllowed`, `scrollingAllowed`, `borderStyle`. (`fitDisplay`, `stretchDisplay`, `<n>%`), `zoomingAllowed`, `scrollingAllowed`, `borderStyle`.
@ -76,8 +68,7 @@ reference is `Layouts.readme` in the same folder; `Layouts-original.xml` is the
| `zoom <level> <frame>` | 0 = fit, 1 = 100 %, 10–1000 = relative % | | `zoom <level> <frame>` | 0 = fit, 1 = 100 %, 10–1000 = relative % |
| `toggleSize fullScreen [n]` / `toggleSize x,y,WxH` | Full screen / given size and back | | `toggleSize fullScreen [n]` / `toggleSize x,y,WxH` | Full screen / given size and back |
| `print frame|frameWithSetup|preview|setup|selectFrame` | Printing (desktop only) | | `print frame|frameWithSetup|preview|setup|selectFrame` | Printing (desktop only) |
| `login`, `logout`, `exit`, `toolbar`, `statusline`, `playback record|view`, `shell client|server <cmd>`, `lookfeel <class>` | | | `login`, `logout`, `exit`, `toolbar`, `statusline`, `playback record|view`, `shell client|server <cmd>`, `lookfeel <class>`, `help` | |
| `help` | Listed in the readme but fails in R1.03: *Unrecognized keyword* (ISS-062) — do not use |
The installed status line also uses item types `displayName`, `playbackIndicator` and The installed status line also uses item types `displayName`, `playbackIndicator` and
`dateTime`, which the readme does not list (ISS-042). `dateTime`, which the readme does not list (ISS-042).
@ -122,116 +113,6 @@ open as windows inside the page; print, look-and-feel and the debug key are not
the layout with `&l=`. Verified: `?d=CIENG_Tank&l=CIENG_Operator` showed the sample menu, the layout with `&l=`. Verified: `?d=CIENG_Tank&l=CIENG_Operator` showed the sample menu,
toolbar, navigation frame and banner. toolbar, navigation frame and banner.
## 6. Parameter reference: desktop vs web (tested 2026-10-02)
Test method: a marked test block in `Layouts.xml`; each layout started on the desktop with
`jwuipoi.cmd -layout <name>` (start options from the installed client: `-layout`, `-display`,
`-host`, `-port`, `-secure`, `-hide`, `-timeout`, `-readtimeout`, `-ssotoken`) and in the browser
with `?d=<display>&l=<layout>`. Desktop windows checked with window captures, web pages in the
browser and in the web client code. "n/a" = the browser window is the main layout.
### 6.1 Frames
| Parameter | Desktop | Web |
|---|---|---|
| `rows`/`cols` in pixels | exact | exact |
| `fitDisplay` | fits the display | edge panel only; default 200 px (left/right) or 50 px (top) |
| `n*` fractions (`2*,1*`) | **not honoured** (sizes follow the displays, e.g. 800:88 px) | every `n*` becomes the *main* panel; two `n*` overwrite each other, only the last display shows |
| Divisions per frame set | any | first = top/left, last = bottom/right, `n*` = main; more do not fit |
| Nested `frame-set` | anywhere, several | **always placed in the parent's main panel**; two nested sets, or one in an edge position, break the page (stays on *Loading…*) |
| Frame `zoom` (`fitDisplay`, `stretchDisplay`, `n%`) | applied | ignored (always 100 %) |
| `borderStyle` | drawn | only with `drawBorder="true"`; every value except `none` becomes a 1 px line |
| `stackSize` | honoured | honoured; default when missing = 1 |
| `zoomingAllowed="false"` | `zoom` commands on that frame do nothing | zoom not supported at all |
| `scrollingAllowed` | scrollbars when the display is larger | panel overflow auto/hidden |
| `initialDisplay` of frame `default` | replaced by the user profile's initial display | replaced by `?d=` |
### 6.2 Window (`<layout>`)
| Parameter | Desktop | Web |
|---|---|---|
| `title` | `$<frame>` → display **title** | `$<frame>` → display title or name; **missing `title` → tab shows "undefined"** and a script error |
| `icon` | title bar and taskbar | favicon |
| `drawBorder` | default **false** = no title bar and no border | frame borders only |
| `sizingAllowed`, `minimizingAllowed` | default **false** | n/a |
| `closingAllowed="false"` | close button still shown, closing is ignored; closing the last window ends the client | n/a |
| `alwaysOnTop` | topmost window | n/a |
| `initialPosition` `pixels`, `pixelsScreen1`, `centreScreen` | exact | n/a |
| `initialSize` `pixels` / `fitFrames` / `screenSize` / `desktopSize` | exact / wraps the display / whole screen incl. taskbar (same on one screen) | n/a |
| Defaults (nothing set) | borderless, at 0,0, sized to the display | works |
| `lookAndFeel` (Metal) | applied; adds a second (Metal) title bar inside the window | n/a |
### 6.3 Menu, toolbars, status line
| Item | Desktop | Web |
|---|---|---|
| `type="sub"` / `check` / `radio` | work (radio bullet, check tick) | **not shown** (items dropped) |
| `accelerator` | F11 works; F5 / ALT keys not confirmed | — |
| `$` in `tooltip` | resolved | resolved |
| Toolbar `position="top"` | shown | shown |
| Toolbar `left` / `right` | shown | **not shown** |
| Toolbar `bottom` | **not shown** (two layouts tried) | not shown |
| Toolbar item `combo`, `editableCombo`, `dropdownList` | shown | shown |
| Status line, all 8 types | shown | shown |
### 6.4 Commands
| Command | Desktop | Web |
|---|---|---|
| `navigate to <frame> <display> [zoom] [params]` | works, zoom applied | works, **zoom ignored** |
| `navigate back/forward/home/up/history/backList/forwardList` | work | work (`home` is added to the history) |
| `reload <frame>` / `reload all` | work | work |
| `zoom <level> <frame>` (0, 1, 2, 0.5, 150) | work | not supported |
| `toggleSize fullScreen [n]` | work area (taskbar stays unless `alwaysOnTop`); again = back | browser full screen; screen number ignored |
| `toggleSize x,y,WxH` | works; again = back | not possible in a browser tab |
| `toolbar` (check) | hides/shows **all** toolbars; `toolbar false` behaves as a toggle too | no effect |
| `statusline` (check) | hides/shows (a piece of the date field stays painted) | no effect |
| `print …` | preview / setup dialogs open | disabled |
| `login` / `logout` / `exit` | — / — / closes | login disabled; logout, exit work |
| `shell client <cmd>` | runs on the client (Notepad opened) | sent to the server; `shell client ACTION <layout command>` runs a layout command |
| `lookfeel <class>` | — | no effect |
| `playback record` (check) / `view` | — | not supported (view disabled) |
| `help` | **error** *Unrecognized keyword* | — |
"—" = not checked.
### 6.5 Layouts opened from a display, translations, debug key
Tested with a launcher display (copy of `CIENG_Menu` whose buttons use *Open display* with a
layout and frame `default`).
| Parameter | Desktop | Web |
|---|---|---|
| `modal="true"` | dialog window (no min/max); the opener is disabled until it closes | in-page window with a full-page lock; centred |
| `maximumOpen="2"` | 2 windows; the 3rd click: *The display '…' cannot be activated because the maximum number of windows is reached* | same (in-page windows, same message) |
| Popup size (`initialSize="pixels"`) | applied | applied (500×350, 450×300) |
| `initialPosition="centreFrame"` | **at 0,0** (not centred) | centred in the page |
| `initialPosition="centreLayout"` | near the opener, not exactly centred (opener partly off-screen) | centred in the page |
| `atCursor` / `awayFromCursor` | opened at 1677,363 near the launcher click (cursor position not logged) / at 10,890, the far bottom-left corner | — |
| `<translations name="<locale>">` | applied for the exact JVM locale (`en_AU` here): layout `title`, menu and toolbar `label`, `tooltip`; **no fallback** from `en_AU` to `en` | browser locale `en-US`: neither `en_AU` nor `en` applied |
| `debugActivationKey` (`CONTROL SHIFT F6`) | opens the *Graphics debugger* (connections and parameters of the display) | not supported (see §5) |
Keys: `<layout name>.title`, `<item name>.label|tooltip|mnemonic|accelerator`. The desktop
locale comes from Windows (the start script sets no `-Duser.language`).
### 6.6 Tabs (`<tab>`)
Factory pattern (works on both clients): a `<tab name="default">` holding frames `tab1`,
`tab2`, … in the `n*` slot of a **nested** frame set, next to the navigation frame.
| Parameter | Desktop | Web |
|---|---|---|
| Tab labels | display title (the profile's initial display goes into the first tab) | display name |
| `tabPosition` `bottom` / `left` | applied | **ignored** (always top) |
| `navigate to <tab set name> <display>` | replaces the display in the **active** tab; no new tab | — |
| `navigate to <tab frame name> <display>` | shows it in that tab | — |
| `closeTabAllowed` on a tab frame | `true` = close button, `false` = none; closing works | same |
| `closeTabAllowed` (and other defaults) on `<tab>` only | **not inherited** by the frames (no close buttons) | not inherited |
| `maximumTabs` | does not limit the initial tabs (`1` with 2 frames shows 2); the limit for new tabs was not reached by `navigate`, so not confirmed | initial tabs not limited |
| `minimumTabLabelWidth`, `tabButtonGap` | no visible effect | — |
| Frame with `initialDisplay=""` | empty tab | — |
| Tab set next to the nav frame at the **top level** (with menu, empty tab) | works | **hangs** on *Loading…* (nav frame not created); the factory shape works |
## Verified (CI-Eng-Sample, 2026-10-01) ## Verified (CI-Eng-Sample, 2026-10-01)
`layout.ps1` add / remove / add (removal identical to the original, backup kept); Operator `layout.ps1` add / remove / add (removal identical to the original, backup kept); Operator

View file

@ -81,9 +81,3 @@ development system (see "Test system" in `progress.md`); they do not exist on ot
| ISS-059 | 2026-10-02 | DATA EXPOSURE (authentication) | IM 36K10G10 §10.2 says to add the `CIX_PROCESS` account to SQL Server as a Windows user (db_owner) in a domain. The CI Service runs as the **local** `.\CIX_PROCESS` (also on the user's domain-joined R1.05 CI Server), which a SQL Server on another host cannot authenticate. | closed | Closed 2026-10-02 (confirmed by user): use a SQL login with db_owner on the target database; SQL Server set to mixed mode (needs a SQL Server restart). Windows authentication only if the SQL host knows the account (not tested). Tested in R1.05 only. | `.claude/skills/data-access/tasks/rdbms-exposure.md` (done); `knowledge/manuals/IM36K10G10-01EN.md` (done) | | ISS-059 | 2026-10-02 | DATA EXPOSURE (authentication) | IM 36K10G10 §10.2 says to add the `CIX_PROCESS` account to SQL Server as a Windows user (db_owner) in a domain. The CI Service runs as the **local** `.\CIX_PROCESS` (also on the user's domain-joined R1.05 CI Server), which a SQL Server on another host cannot authenticate. | closed | Closed 2026-10-02 (confirmed by user): use a SQL login with db_owner on the target database; SQL Server set to mixed mode (needs a SQL Server restart). Windows authentication only if the SQL host knows the account (not tested). Tested in R1.05 only. | `.claude/skills/data-access/tasks/rdbms-exposure.md` (done); `knowledge/manuals/IM36K10G10-01EN.md` (done) |
| ISS-060 | 2026-10-02 | DATA EXPOSURE (rows of steady items) | IM 36K10G10 ch. 10 says `ITEM_VALUES` is exposed once per interval, with the aggregation time as timestamp when the item did not change. In one snapshot on R1.05 (1-minute interval), changing items had rows at 02:13:23 while steady items (`VALUE_COUNT` 1) were still at 02:12:24. Whether steady items get a row every interval (maybe written later) or only after an update is not known. | open | Count rows per item over one hour (`SELECT NAME, COUNT(*) … WHERE [TIMESTAMP] > … GROUP BY NAME`) and compare steady with changing items. Until then the task says: take a steady item's last row at or before T. | `.claude/skills/data-access/tasks/rdbms-exposure.md` | | ISS-060 | 2026-10-02 | DATA EXPOSURE (rows of steady items) | IM 36K10G10 ch. 10 says `ITEM_VALUES` is exposed once per interval, with the aggregation time as timestamp when the item did not change. In one snapshot on R1.05 (1-minute interval), changing items had rows at 02:13:23 while steady items (`VALUE_COUNT` 1) were still at 02:12:24. Whether steady items get a row every interval (maybe written later) or only after an update is not known. | open | Count rows per item over one hour (`SELECT NAME, COUNT(*) … WHERE [TIMESTAMP] > … GROUP BY NAME`) and compare steady with changing items. Until then the task says: take a steady item's last row at or before T. | `.claude/skills/data-access/tasks/rdbms-exposure.md` |
| ISS-061 | 2026-10-02 | INSTALLATION (folder permissions) | On the user's R1.05 system installed in `C:\Yokogawa\CIServer` (outside Program Files) `tls\sup` and `dbc.sup` inherit **Authenticated Users: Modify** (plus Users: Read): any signed-in user can read the SQL password in `dbc.sup` and change setup files. On the R1.03 development machine (Program Files) `tls\sup` gives Users: ReadAndExecute (read still possible, no write). | closed | Closed 2026-10-02 (user decision: shared internal dev/demo server, left as is). Option if needed, not applied or tested: `icacls <dbc.sup> /inheritance:r /grant:r "SYSTEM:(F)" "Administrators:(F)" "CIX_PROCESS:(R)"`; folder rights in general are set by the IT Security Tool. | `.claude/skills/installation-security/tasks/setup-check.md` (done); `.claude/skills/data-access/tasks/rdbms-exposure.md` (done) | | ISS-061 | 2026-10-02 | INSTALLATION (folder permissions) | On the user's R1.05 system installed in `C:\Yokogawa\CIServer` (outside Program Files) `tls\sup` and `dbc.sup` inherit **Authenticated Users: Modify** (plus Users: Read): any signed-in user can read the SQL password in `dbc.sup` and change setup files. On the R1.03 development machine (Program Files) `tls\sup` gives Users: ReadAndExecute (read still possible, no write). | closed | Closed 2026-10-02 (user decision: shared internal dev/demo server, left as is). Option if needed, not applied or tested: `icacls <dbc.sup> /inheritance:r /grant:r "SYSTEM:(F)" "Administrators:(F)" "CIX_PROCESS:(R)"`; folder rights in general are set by the IT Security Tool. | `.claude/skills/installation-security/tasks/setup-check.md` (done); `.claude/skills/data-access/tasks/rdbms-exposure.md` (done) |
| ISS-062 | 2026-10-02 | GRAPHICS (layouts) | `Layouts.readme` lists the menu/toolbar command `help`, but in R1.03 the Operator Interface fails with *Failed to execute menu command 'help'*, *Unrecognized keyword* (`MNUCMD`, `IllegalArgumentException`). The factory layouts do not use it. | open | Software is the reference: documented as not supported. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
| ISS-063 | 2026-10-02 | GRAPHICS (layouts) | The readme does not say that menu items with the commands `toolbar`, `statusline` and `playback record` must be `type="check"`. With a normal item the Operator Interface does not start (*INITFAILED*, `JMenuItem cannot be cast to JCheckBoxMenuItem` in `MenuToolbarOption.checkState`); the web client just drops check items. | open | Rule added to the task. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
| ISS-064 | 2026-10-02 | GRAPHICS (layouts) | Readme: `rows`/`cols` `n*` values share the remaining space by fraction (as HTML frames). Observed: the desktop ignores the fractions (`2*,1*` gave 800:88 px, sizes follow the displays); the web client turns every `n*` into its single *main* panel, so two `n*` overwrite each other. | open | Use one `n*` per frame set, all other divisions in pixels or `fitDisplay`. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
| ISS-065 | 2026-10-02 | GRAPHICS (layouts, web) | The web client (HTML display) supports only part of `Layouts.xml`: nested frame sets only in the parent's main (`n*`) slot (other placements hang on *Loading…*), frame `zoom` and navigate zoom ignored, `zoom`/`print`/`login`/`toolbar`/`statusline`/`lookfeel`/`playback` not supported, menu `sub`/`check`/`radio` items and left/right/bottom toolbars not shown, a layout without `title` shows *undefined*. Not described in the readme or IM 36K10R30. | open | Documented in the task (§6, tested and read from the web client code). Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
| ISS-066 | 2026-10-02 | GRAPHICS (layouts) | Readme options that do not work as described in R1.03: a toolbar with `position="bottom"` is not shown (desktop and web; left/right work on the desktop); `initialPosition="centreFrame"` opens the window at 0,0 on the desktop; translations are used only for the exact locale (no fallback from `en_AU` to `en`). | open | Documented in the task. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6 (done) |
| ISS-067 | 2026-10-02 | GRAPHICS (layouts, tabs) | Readme: `<tab>` provides defaults (`closeTabAllowed`, `stackSize`, …) for its frames, and `maximumTabs`, `minimumTabLabelWidth`, `tabButtonGap`, `tabPosition` control the tabs. Observed: defaults on `<tab>` are not inherited (close buttons only with `closeTabAllowed` on each frame); `maximumTabs` does not limit the initial tabs; label width and gap show no effect on the desktop; the web client ignores `tabPosition` (always top) and hangs when the tab set sits next to the nav frame at the top level (factory shape with a nested frame set works). | open | Documented in the task; use the factory pattern. Close when the user confirms. | `.claude/skills/graphics/tasks/layouts.md` §6.6 (done) |

View file

@ -134,7 +134,6 @@ now come before classes and objects (phase 6), and the other interfaces follow a
| C50 | Build a display in the Edit Module, check the XML ([task](../.claude/skills/graphics/tasks/create-display.md)) | passed | passed | User built `CIENG_Tank` (HTML mode): text, number field, alarm overview, trend. File stores item name + id; after a sample reload (id 248 → 268) validation still passed and a new session showed live values. | | C50 | Build a display in the Edit Module, check the XML ([task](../.claude/skills/graphics/tasks/create-display.md)) | passed | passed | User built `CIENG_Tank` (HTML mode): text, number field, alarm overview, trend. File stores item name + id; after a sample reload (id 248 → 268) validation still passed and a new session showed live values. |
| C50/R30 | Deploy/remove, `jwuiutl` HTML export, validate, search; HTML display in the browser ([task](../.claude/skills/graphics/tasks/deploy-displays.md)) | passed | passed | Scripts `displays/deploy_displays.cmd` / `remove_displays.cmd`; command-line HTML identical to the Edit Module's. Number field live in the browser; HTML trend draws no line (ISS-041). Browser page reload ends the session; the display menu *View > Reload* keeps it (user). | | C50/R30 | Deploy/remove, `jwuiutl` HTML export, validate, search; HTML display in the browser ([task](../.claude/skills/graphics/tasks/deploy-displays.md)) | passed | passed | Scripts `displays/deploy_displays.cmd` / `remove_displays.cmd`; command-line HTML identical to the Edit Module's. Number field live in the browser; HTML trend draws no line (ISS-041). Browser page reload ends the session; the display menu *View > Reload* keeps it (user). |
| R30/C50 | Operator layout `CIENG_Operator` (menu, toolbar, navigation/main/banner frames, status line) added with `layout.ps1`; navigation display `CIENG_Menu`; open displays in frames, layouts and the `popup` layout ([task](../.claude/skills/graphics/tasks/layouts.md)) | passed | passed | Desktop: second 1600 x 900 window, frame navigation and Back, popup on top and minimised with its parent, F11 within taskbar limits; the Operator Interface must be restarted after `Layouts.xml` changes; factory `default` layout unchanged for Admin. Web: `?d=CIENG_Tank&l=CIENG_Operator`. Status line/command names not in the readme (ISS-042). A stray trend property connection caused a desktop error (ISS-041 update). | | R30/C50 | Operator layout `CIENG_Operator` (menu, toolbar, navigation/main/banner frames, status line) added with `layout.ps1`; navigation display `CIENG_Menu`; open displays in frames, layouts and the `popup` layout ([task](../.claude/skills/graphics/tasks/layouts.md)) | passed | passed | Desktop: second 1600 x 900 window, frame navigation and Back, popup on top and minimised with its parent, F11 within taskbar limits; the Operator Interface must be restarted after `Layouts.xml` changes; factory `default` layout unchanged for Admin. Web: `?d=CIENG_Tank&l=CIENG_Operator`. Status line/command names not in the readme (ISS-042). A stray trend property connection caused a desktop error (ISS-041 update). |
| R30/C50 | Layout parameters one by one on test layouts (`LT_*`): frames, window options, menu/toolbar/status line, all commands ([task](../.claude/skills/graphics/tasks/layouts.md) §6) | passed | n/a | 2026-10-02. Desktop via `jwuipoi -layout`, web via `&l=`; desktop login temporarily *Automatic*; popups, modal, maximumOpen via launcher display `LT_Launcher`. Tabs on `LT_Tabs*`. Readme differences and web limits: ISS-062..067. Not tested: print orientation/margins, playback, multi-screen positions, the `maximumTabs` limit for new tabs. Test layouts need no project data (not added to CI-Eng-Sample). |
| C50/R30 | Trend settings one by one on `CIENG_TrendLab` (pen source, type, scale, axis, grid, limits; time range, performance, appearance, time axis, legend, pen panel; property sheet listed) ([task](../.claude/skills/graphics/tasks/trend.md)) | passed (desktop) | passed | 2026-10-02, user confirmed each round with screenshots. Pen limits, pen title and `backgroundPaint` had no effect (ISS-056). Internal items need `trend_feed.ps1` after a restart. | | C50/R30 | Trend settings one by one on `CIENG_TrendLab` (pen source, type, scale, axis, grid, limits; time range, performance, appearance, time axis, legend, pen panel; property sheet listed) ([task](../.claude/skills/graphics/tasks/trend.md)) | passed (desktop) | passed | 2026-10-02, user confirmed each round with screenshots. Pen limits, pen title and `backgroundPaint` had no effect (ISS-056). Internal items need `trend_feed.ps1` after a restart. |
| C50/R30 | HTML trend: cause of the empty web trend and 50-pen workaround (`add_trend_spares.ps1`); Micro Trend ([task](../.claude/skills/graphics/tasks/trend.md) §6) | passed (workaround) | passed | Web code always builds 50 columns (ISS-041). Padded `CIENG_TrendLab` draws in the browser with a clean legend; web ignores *Show in legend* (ISS-056). Micro Trend drew once, then blank (ISS-055). | | C50/R30 | HTML trend: cause of the empty web trend and 50-pen workaround (`add_trend_spares.ps1`); Micro Trend ([task](../.claude/skills/graphics/tasks/trend.md) §6) | passed (workaround) | passed | Web code always builds 50 columns (ISS-041). Padded `CIENG_TrendLab` draws in the browser with a clean legend; web ignores *Show in legend* (ISS-056). Micro Trend drew once, then blank (ISS-055). |
| C50/R30 | Web check of each trend setting (4 batches on a padded scratch copy, checked in the browser by Claude) ([task](../.claude/skills/graphics/tasks/trend.md) §6) | passed | passed | 2026-10-02. Works / ignored / different table in the task; matches IM 36K10C50 Table 2.27-28 except `timeShift` (error message) and *Show in legend* (ISS-056). A hidden real pen breaks the 50-pen workaround (confirmed). | | C50/R30 | Web check of each trend setting (4 batches on a padded scratch copy, checked in the browser by Claude) ([task](../.claude/skills/graphics/tasks/trend.md) §6) | passed | passed | 2026-10-02. Works / ignored / different table in the task; matches IM 36K10C50 Table 2.27-28 except `timeShift` (error message) and *Show in legend* (ISS-056). A hidden real pen breaks the 50-pen workaround (confirmed). |