From bf7d88a0279d97964d0594ace0a29896b3299921 Mon Sep 17 00:00:00 2001 From: cliu Date: Fri, 9 Oct 2026 10:21:36 +1100 Subject: [PATCH] R1.05 re-check batch 3: alarms, audit, authorization, classes, HAC, reporting, pyTOOLS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full manual diffs (L15, C20, E30, L25, J40, C10 §2, L10, P10, P11, J20, C30, P20, R40, E10) and read-only checks on the shared R1.05 test server. Skills and summaries moved to R1.05; new skill pytools (IM 36K10P40) from docs (no Python on the test server). Issues ISS-132..181; corrections to version-differences (E10, E30, P11, dss_ath_grp_u0104); C10 summary lists the 3 new authorization actions; r105-verification V10-V17. Co-Authored-By: Claude Opus 5.5 --- .claude/skills/alarm-management/SKILL.md | 56 +++-- .../alarm-management/tasks/alarm-checks.md | 76 ++++--- .../tasks/alarm-definitions.md | 21 +- .../alarm-management/tasks/item-alarming.md | 39 +++- .claude/skills/audit-trail/SKILL.md | 31 ++- .../skills/audit-trail/tasks/audit-checks.md | 32 ++- .../audit-trail/tasks/configure-audit.md | 26 ++- .../audit-trail/tasks/read-audit-trail.md | 58 ++++- .claude/skills/authorization/SKILL.md | 50 +++-- .../authorization/tasks/active-directory.md | 14 +- .../authorization/tasks/login-methods.md | 52 +++-- .../authorization/tasks/users-groups.md | 45 +++- .../skills/class-object-engineering/SKILL.md | 43 +++- .../tasks/change-reset-class.md | 6 +- .../tasks/java-class.md | 35 ++- .../tasks/load-class-object.md | 15 +- .../tasks/opcdbg-checks.md | 24 ++- .../tasks/traditional-class.md | 6 +- .claude/skills/high-availability/SKILL.md | 35 ++- .../high-availability/tasks/hac-checks.md | 38 +++- .../tasks/redundant-setup.md | 36 +++- .../tasks/standalone-recovery.md | 14 +- .claude/skills/pytools/SKILL.md | 64 ++++++ .../pytools/tasks/event-notification.md | 85 ++++++++ .claude/skills/pytools/tasks/filter-index.md | 91 ++++++++ .../skills/pytools/tasks/modify-datasets.md | 95 ++++++++ .../pytools/tasks/read-items-history.md | 103 +++++++++ .../pytools/tasks/setup-first-script.md | 116 ++++++++++ .claude/skills/reporting/SKILL.md | 34 ++- .../skills/reporting/tasks/define-reports.md | 26 ++- .../skills/reporting/tasks/output-devices.md | 19 +- .../skills/reporting/tasks/report-checks.md | 29 ++- .../skills/reporting/tasks/rql-interactive.md | 40 +++- knowledge/document-map.md | 2 +- knowledge/issues.md | 46 +++- knowledge/manuals/IM36K10C10-01EN.md | 3 + knowledge/manuals/IM36K10C20-01EN.md | 22 +- knowledge/manuals/IM36K10C30-01EN.md | 20 +- knowledge/manuals/IM36K10E10-01EN.md | 10 +- knowledge/manuals/IM36K10E30-01EN.md | 17 +- knowledge/manuals/IM36K10J20-01EN.md | 45 +++- knowledge/manuals/IM36K10J40-01EN.md | 27 ++- knowledge/manuals/IM36K10L10-01EN.md | 42 +++- knowledge/manuals/IM36K10L15-01EN.md | 48 ++++- knowledge/manuals/IM36K10L25-01EN.md | 48 ++++- knowledge/manuals/IM36K10P10-01EN.md | 13 +- knowledge/manuals/IM36K10P11-01EN.md | 44 +++- knowledge/manuals/IM36K10P20-01EN.md | 22 +- knowledge/manuals/IM36K10P40-01EN.md | 203 ++++++++++++++++++ knowledge/manuals/IM36K10R40-01EN.md | 16 +- knowledge/progress.md | 14 +- knowledge/r105-verification.md | 22 ++ knowledge/version-differences.md | 12 +- 53 files changed, 1826 insertions(+), 304 deletions(-) create mode 100644 .claude/skills/pytools/SKILL.md create mode 100644 .claude/skills/pytools/tasks/event-notification.md create mode 100644 .claude/skills/pytools/tasks/filter-index.md create mode 100644 .claude/skills/pytools/tasks/modify-datasets.md create mode 100644 .claude/skills/pytools/tasks/read-items-history.md create mode 100644 .claude/skills/pytools/tasks/setup-first-script.md create mode 100644 knowledge/manuals/IM36K10P40-01EN.md diff --git a/.claude/skills/alarm-management/SKILL.md b/.claude/skills/alarm-management/SKILL.md index 17e61f0..26fd174 100644 --- a/.claude/skills/alarm-management/SKILL.md +++ b/.claude/skills/alarm-management/SKILL.md @@ -1,25 +1,38 @@ --- name: alarm-management description: >- - CI Server R1.03 ALARM Service and alarm engineering. Use when the user wants to switch on + CI Server R1.05 ALARM Service and alarm engineering. Use when the user wants to switch on alarms for an item (alarming, limits, HIGH / HIGH HIGH / LOW alarms, alarm state, priority, alarm text), set up acknowledgement types (manual / automatic acknowledgement, ack matrix, ALARM_ACK_DF), areas of interest (AOI), alarm selection areas (ASA, alarm filter expressions, compile), delayed or repeated alarms, first-out groups, alarm collections (first-up), read or - acknowledge current alarms and alarm history (ALARM_CURRENT, ALARM_CHRONO), generate a test or - informational event, check the alarm kernel or storage (ALM, ALH, ALDPRT, almdbg, alhdbg, - alm.sup, alh.sup, aldprt.sup), configure alarm e-mail / SMS notification (alnmgr, alnsmtp), - alarm shelving (asbman), alarm sound (aldaco), alarm counting (aldcnt), external alarms (EAL, - OPC UA alarms, CENTUM VP Vnet alarms) or analyse alarm performance (ASPA, alarm floods, KPIs, - EEMUA 191, ISA 18.2). Sources IM 36K10L15-01EN, IM 36K10C20-01EN, IM 36K10E30-01EN. + acknowledge current alarms and alarm history (ALARM_CURRENT, ALARM_CHRONO), acknowledge with a + reason and approver (custom alarm acknowledgement), generate a test or informational event, + check the alarm kernel or storage (ALM, ALH, ALDPRT, almdbg, alhdbg, alm.sup, alh.sup, + aldprt.sup, ?*_alarm_start.cmd extension scripts), configure alarm e-mail / SMS notification + (alnmgr, alnsmtp, alnsms), alarm shelving (asbman), alarm sound (aldaco), alarm counting + (aldcnt), external alarms (EAL, OPC UA alarms, CENTUM VP Vnet alarms), analyse alarm + performance (ASPA, alarm floods, KPIs, EEMUA 191, ISA 18.2, KPI charts In Time / Too Late / + Not Ackn / Nuisance), or ask about the internal dataset ALARM_ATTRIBUTE_TEMP_DF. Sources + IM 36K10L15-01EN, IM 36K10C20-01EN, IM 36K10E30-01EN. --- -# Alarm management (R1.03) +# Alarm management (R1.05) + +Re-checked for R1.05 on 2026-10-09 (read-only). The L15 and C20 manuals did not change in +substance (full text diff), E30 only got KPI chart labels. The installed alarm setup files, +setup templates and alarm dataset definitions are identical to R1.03, except: the start/stop +scripts call extension scripts, `alnsms.sup` has new defaults, and there is a new internal +dataset `ALARM_ATTRIBUTE_TEMP_DF` (details in `tasks/alarm-checks.md` §5). Paths below use the +`TLS_*` variables; the R1.05 test server has program and data under one root (see +`knowledge/version-differences.md`). Background: `knowledge/manuals/IM36K10L15-01EN.md` (kernel, events, mechanisms, setup files, debuggers), `IM36K10C20-01EN.md` (Engineering Module forms, filters, grouping, shelving, notifications, external alarms), `IM36K10E30-01EN.md` (ASPA tool and KPI targets). Item limits -and statuses: skill `item-engineering`. OPC UA alarm sources: skill `data-access`. +and statuses: skill `item-engineering`. OPC UA alarm sources: skill `data-access`. Display-side +acknowledgement with reason and approver: skill `graphics` (`tasks/create-display.md`); +the audit record: skill `audit-trail`. Rules: - Run `system-check` first; follow the user's chosen way of working. @@ -29,20 +42,29 @@ Rules: (L15 summary, C20 §A2). - Writing a value to force a test alarm changes live data (`system-management`, task `read-write-item.md`): only on test items, and restore the value. +- **The alarm storage process `ALH` serves every client.** Do not put an alarm overview + filtered by an ASA on `SECTION` or `UNIT` on a display of a shared or production server, and + do not run heavy alarm queries (`ALARM_CHRONO` without a narrow time range, big ASPA fetches): + on the shared R1.05 test server such an overview kept `ALH` at a full CPU core and made every + other alarm list time out (ISS-136). Filter by item name or AOI, or use small item-based + lists. - `almdbg` options 3, 13, 15, 17, 19, 20, 25, 26 and `alhdbg` 3, 4 change or stop things: never without approval. Read-only options are listed in `tasks/alarm-checks.md`. - Setup files (`alm.sup`, `alh.sup`, `aldprt.sup`, `aln*.sup`, `asbman.sup`, `wfladi.sup`) need admin rights and a restart: hand changes to the user (skill `portal-setup`, task - `change-setup-file.md`). + `change-setup-file.md`). To start an extra alarm process (e.g. `aldcnt`, `alnsms`) with + CI Server on R1.05, prefer an extension script `_alarm_start.cmd` / + `_alarm_stop.cmd` in `tls\com` over editing `alarm_start.cmd` (ISS-121). | Task | File | Status | |---|---|---| -| Acknowledgement type, area of interest, alarm selection area by quick load; compile check | `tasks/alarm-definitions.md` | verified | -| Switch on alarming for an item; delay / repeat; test an alarm; read and acknowledge current alarms and history | `tasks/item-alarming.md` | verified | -| Read-only checks: alarm processes, destinations, statistics, item alarm parameters, storage group, setup files; generate an INFO event | `tasks/alarm-checks.md` | verified | +| Acknowledgement type, area of interest, alarm selection area by quick load; compile check | `tasks/alarm-definitions.md` | verified (R1.03); R1.05: dataset definitions identical, sample definitions loaded with 0 errors (load check only, 2026-10-08) | +| Switch on alarming for an item; delay / repeat; test an alarm; read and acknowledge current alarms and history | `tasks/item-alarming.md` | verified (R1.03); R1.05: definitions identical, sample item alarm loaded with 0 errors (2026-10-08); alarm behaviour not re-tested on the shared server | +| Read-only checks: alarm processes, destinations, statistics, ack types, storage group, setup files; generate an INFO event | `tasks/alarm-checks.md` | verified (R1.03; read-only checks re-run on R1.05 2026-10-09; INFO event not generated on R1.05) | +| Custom alarm acknowledgement with reason and approver (display properties, `AUDIT_TRAIL` `APPROVAL_REASON` / `APPROVER`) | `tasks/item-alarming.md` §4, skill `graphics` | from docs (R1.04+), not tested (ISS-099) | | First-out groups, alarm collections (first-up, status/ack/reset items) | C20 summary §A6 | from docs | -| Alarm overviews, priority labels, link display, shelving | C20 summary §A3, §A9, §A10 | from docs (needs displays, phase 10) | -| E-mail / SMS notification | L15 summary §10, C20 §A11 | from docs (needs an SMTP server without authentication) | +| Alarm overviews, priority labels, link display, shelving | C20 summary §A3, §A9, §A10 | from docs (needs displays) | +| E-mail / SMS notification | L15 summary §10, C20 §A11 | from docs (needs an SMTP server without authentication / a GSM modem); R1.05 `alnsms.sup` defaults changed (ISS-134) | | Acoustic (`aldaco`) and count (`aldcnt`) destinations, split storage processes | L15 summary §7, §8 | from docs | -| External alarms (EAL) from OPC UA servers or CENTUM VP | C20 summary part B | from docs (no A&C source / Vnet on the test system) | -| Alarm performance analysis (ASPA) | E30 summary | from docs | +| External alarms (EAL) from OPC UA servers or CENTUM VP | C20 summary part B | from docs; not tested on R1.05 (no A&C source or Vnet on the test server, no EAL defined) | +| Alarm performance analysis (ASPA) | E30 summary | from docs (GUI not opened on either version) | diff --git a/.claude/skills/alarm-management/tasks/alarm-checks.md b/.claude/skills/alarm-management/tasks/alarm-checks.md index 275bc0a..69f496d 100644 --- a/.claude/skills/alarm-management/tasks/alarm-checks.md +++ b/.claude/skills/alarm-management/tasks/alarm-checks.md @@ -1,24 +1,27 @@ --- task: Read-only checks of ALARM Service; generate an informational test event -version: R1.03 -source: IM 36K10L15-01EN §1, §2.6, §3.4, §4.3, §6; IM 36K10C20-01EN §A7; practiced on the test system 2026-10-01 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10L15-01EN §1, §2.6, §3.4, §4.3, §6; IM 36K10C20-01EN §A7 (4th editions, Feb. 2026; content as in the 3rd editions, Sep. 2023); practiced on the R1.03 test system 2026-10-01 and read-only on the R1.05 test server 2026-10-09 +status: verified on R1.03 (2026-10-01). R1.05 - verified (R1.05 test server, 2026-10-09): processes, durwfp, active setup-file lines, almdbg 1/9/12, alhdbg 1, predefined ack types and the ALH storage group; setup files, templates and alarm dataset definitions compared by hash with R1.03 (identical except the files in §5). The INFO event (§4) was not generated on R1.05 (it writes to the shared alarm history). --- # ALARM Service checks ## 1. Processes and setup files (read-only) -| Check | How | Test system result | -|---|---|---| -| Processes | `tasklist` → `alm.exe`, `alh.exe`, `aldprt.exe`, `alnmgr.exe`, `alnsmtp.exe`, `asbman.exe`; `durwfp -p ALM -t 0` → 0 = attached | All six running (`tls\com\alarm_start.cmd`) | -| Kernel setup | `%TLS_ROOT_PATH%\tls\sup\alm.sup` (active lines after `!ENDDEFAULT`) | `SYNC_COMM N`, `SYNC_MSG N`, `QUESIZE 25000`, `RECOVER_QUEUE Y`, `ACK_INFO` | -| Storage setup | `alh.sup` | `CURP`, `CURT`, `CHR`, `QUESIZE 8000`, `MAX-SEARCH 5`, `RECOVER_QUEUE Y`, `DB-JRNL WAL`, `DB-SYNC OFF` | -| Alarm printer | `aldprt.sup` | `FORMAT prio,2,spac,1,type,6,tdef,18,name,40,text,10`, `EVENTS repeat,info,ackn,alarm,prio,firstup` | -| Overview events | `wfladi.sup` `EVENTS` | `alarm,repeat,ackn,deact,info,recov,diag,firstup` (no `DIRECT`) | -| Notification / shelving | `alnmgr.sup`, `alnsmtp.sup`, `alnsms.sup`, `asbman.sup` | Defaults: SMTP `localhost, 25`, SMS `COM1:`, `SYS_WIDE_SHELF N` | -| History storage group | `dssqld -e` filter `'NAME = "ALH"'` on `HIS_GROUP_DF` | Type Alarm, rollover 1 day, lifetime 52 weeks | -| Definitions | `dssqld -e -d ALARM_ACK_DF -c` (also `ALARM_AOI_DF`, `ALARM_ASA_DF`, `ALARM_FO_DF`, `ALARM_FU_DF`, `ALARM_PRIORITY_DF`, `EXTERNAL_ALARM_DF`, `STATUS_DF`) | Predefined ack types `AUTOMATIC`, `MANUAL`, `FULLMANUAL` and their `_EAL` variants; everything else is project data | +| Check | How | R1.03 result | R1.05 result (2026-10-09) | +|---|---|---|---| +| Processes | `tasklist` → `alm.exe`, `alh.exe`, `aldprt.exe`, `alnmgr.exe`, `alnsmtp.exe`, `asbman.exe`; `durwfp -p ALM -t 0` → exit code 0 = attached | All six running (`tls\com\alarm_start.cmd`) | Same six running, `durwfp` 0 for each; `alnsms` and `aldcnt` not running (not started by default) | +| Kernel setup | `%TLS_ROOT_PATH%\tls\sup\alm.sup` (active lines after `!ENDDEFAULT`) | `SYNC_COMM N`, `SYNC_MSG N`, `QUESIZE 25000`, `RECOVER_QUEUE Y`, `ACK_INFO` | Identical | +| Storage setup | `alh.sup` | `CURP`, `CURT`, `CHR`, `QUESIZE 8000`, `MAX-SEARCH 5`, `RECOVER_QUEUE Y`, `DB-JRNL WAL`, `DB-SYNC OFF` | Identical | +| Alarm printer | `aldprt.sup` | `FORMAT prio,2,spac,1,type,6,tdef,18,name,40,text,10`, `EVENTS repeat,info,ackn,alarm,prio,firstup` | Identical | +| Overview events | `wfladi.sup` `EVENTS` | `alarm,repeat,ackn,deact,info,recov,diag,firstup` (no `DIRECT`) | Identical | +| Notification / shelving | `alnmgr.sup`, `alnsmtp.sup`, `alnsms.sup`, `asbman.sup` | Defaults: SMTP `localhost, 25`, SMS `COM1:`, `SYS_WIDE_SHELF N` | Same, but `alnsms.sup` has a new message format and prefix (§5) | +| History storage group | `dssqld -e` filter `'NAME = "ALH"'` on `HIS_GROUP_DF` | Type Alarm, rollover 1 day, lifetime 52 weeks | Same on a fresh install, so 52 weeks is the installed default, not a local change (the C20 manual says 2 days; ISS-036, ISS-135) | +| Definitions | `dssqld -e -d ALARM_ACK_DF -c` (also `ALARM_AOI_DF`, `ALARM_ASA_DF`, `ALARM_FO_DF`, `ALARM_FU_DF`, `ALARM_PRIORITY_DF`, `EXTERNAL_ALARM_DF`, `STATUS_DF`) | Predefined ack types `AUTOMATIC`, `MANUAL`, `FULLMANUAL` and their `_EAL` variants; everything else is project data | Same six predefined ack types (32 matrix fields `NA_N` … `A3N_A3`) | + +Export only the small definition datasets this way. Never export `ALARM_CHRONO` without a +narrow filter on a shared or production server (skill rule, ISS-136). ## 2. Alarm kernel debugger `almdbg` (read-only options) @@ -29,37 +32,56 @@ printf '1\n9\n12\n-1\n' | timeout 20 almdbg printf '14\n
.\n10\n\n-1\n' | timeout 20 almdbg ``` +In a PowerShell script, put the answers in a file (one per line, no blank lines) and start +`almdbg.exe` with `Start-Process -RedirectStandardInput -RedirectStandardOutput +-NoNewWindow -PassThru`, then wait with a timeout (`WaitForExit(25000)`). + | Option | Shows | |---|---| -| 1 | Connected destinations, events sent, overflows (test system: `ALH`, `OPXUAS`, `ALNMGR`, `ALDPRT`) | +| 1 | Connected destinations, events sent, overflows (R1.03 test system: `ALH`, `OPXUAS`, `ALNMGR`, `ALDPRT`; R1.05 test server: the same plus `WFLADI` while an alarm overview is open) | | 5 / 7 / 8 / 23 | First-out groups, first-out / continuation items, collections | -| 9 / 10 | Ack type numbers / matrix of one type (`A` automatic, `M` manual) | +| 9 / 10 | Ack type numbers (R1.05 fresh install: 1–6) / matrix of one type (`A` automatic, `M` manual) | | 11 | Items with repeat or delay running | -| 12 | Statistics: start time, item-based / non-item-based / external events received, events sent | +| 12 | Statistics: start time, item-based / non-item-based / external events received, events sent, list sizes (R1.05 output also shows a counter *non-item-based events 2*) | | 14 | Item alarm parameters: monitoring, diagnostic, ack type number, collection, first-out, repeat, delay | -The last `-1` makes DURTIM log `DUR-W-REM_PROC, Process ALMDBG_ exited unexpectedly` -in `umhlog.log`: harmless. A blank answer takes the default shown in brackets; an empty line at -the main prompt repeats the previous action — never send blank lines blindly. +The menu range is −1 … 28 on both versions. The last `-1` makes DURTIM log +`DUR-W-REM_PROC, Process ALMDBG_ exited unexpectedly` in `umhlog.log`: harmless. A blank +answer takes the default shown in brackets; an empty line at the main prompt repeats the +previous action — never send blank lines blindly. ## 3. Storage debugger `alhdbg` `printf '1\n-1\n' | timeout 10 alhdbg` → storage groups with current unit, cell and start -time (test system: group 3, unit 80). Option 2 lists the units of one group. Options 3 (force -connect) and 4 (stop ALH) only with approval. +time (R1.03 and R1.05: group 3). Option 2 lists the units of one group. Options 3 (force +connect) and 4 (stop ALH) only with approval. Menu range −1 … 4 on both versions. ## 4. Generate an informational test event (`almdbg` 16) -Changes the alarm history (adds one INFO event; no effect on current alarms). With approval: +Changes the alarm history (adds one INFO event; no effect on current alarms). With approval, +and only on a system where an extra history record does not matter: ``` printf '16\n\n0\n15\n
.\n\n\n-1\n' | timeout 15 almdbg ``` Prompts: timestamp (blank = now), milliseconds, priority (0–15), name, status text, -description. Check with a filter `'EVENT_TYPE = "INFO"'` on `ALARM_CHRONO`. +description. Check with a filter `'EVENT_TYPE = "INFO"'` (plus a time range) on `ALARM_CHRONO`. -**Verified:** the event appears with `EVENT_TYPE` INFO, `ITEM_NAME` = the given name, `ALARM_TEXT` -= status text, `DESCRIPTION` = description, priority 15, ack 1. Other text columns (`INSTALL`, -`UNIT`, `SUB`, `SOURCE`, `CATEGORY`, `CONDITION`) contain leftovers or unreadable characters -(ISS-037): use the event only as a test marker. +**Verified (R1.03):** the event appears with `EVENT_TYPE` INFO, `ITEM_NAME` = the given name, +`ALARM_TEXT` = status text, `DESCRIPTION` = description, priority 15, ack 1. Other text columns +(`INSTALL`, `UNIT`, `SUB`, `SOURCE`, `CATEGORY`, `CONDITION`) contain leftovers or unreadable +characters (ISS-037): use the event only as a test marker. Not run on R1.05. + +## 5. What changed in the installed files on R1.05 + +Compared with R1.03 by file hash (2026-10-08) and line by line (2026-10-09): + +| File | Change | +|---|---| +| `alm.sup`, `alh.sup`, `aldprt.sup`, `aldaco.sup`, `aldcnt.sup`, `alnmgr.sup`, `alnsmtp.sup`, `asbman.sup`, `ald_spec_stat.sup`, `wfladi.sup` and their templates; `alarm_build`, `alarm_compile` | Identical | +| `alarm_start.cmd`, `alarm_stop.cmd` | At the end (start) / beginning (stop) they call every `?*_alarm_start.cmd` / `?*_alarm_stop.cmd` in `tls\com` (ISS-121). Processes started are the same as on R1.03 | +| `alnsms.sup` / `.tpl` | New format units `SECTION` and `NAME` in the help; active defaults changed: `BODY_FORMAT = PRIO,2,SPAC,1,TYPE,6,TDEF,18,TEXT,6,SECTION,120` (R1.03: priority, type, time, `NAM1`–`NAM4`, text) and `ALARM_PREFIX = PRIO` (R1.03 ``). `alnsms` is not started by default; not tested (ISS-134) | +| `almini.sup` | Licence line only (instance file) | +| Alarm dataset definitions (`alarm_*.dss`) | Identical, including `ALARM_CURRENT` and `ALARM_CHRONO`. `external_alarm_df.dss` differs only by a space; its data access server got an internal fix for record updates | +| `alarm_attribute_temp_df.dss` | **New**: dataset `ALARM_ATTRIBUTE_TEMP_DF`, same fields as `ALARM_ATTRIBUTE_DF` (`NAME`, `ATTRIBUTE_TYPE`, `STATION`, hidden `ATTRIBUTE_INDEX`, `SPARE`), described in its header as a temporary store for item-specific alarm attributes; concealed on an enterprise server, no data file, no index on `ATTRIBUTE_INDEX`. On the R1.05 test server it has 0 records and is referenced only by the data dictionary and the RESTful API server (`jrstsrv.jar`, alarm attribute class). Internal: do not load, export or back it up (ISS-133) | diff --git a/.claude/skills/alarm-management/tasks/alarm-definitions.md b/.claude/skills/alarm-management/tasks/alarm-definitions.md index bb9b96e..2323614 100644 --- a/.claude/skills/alarm-management/tasks/alarm-definitions.md +++ b/.claude/skills/alarm-management/tasks/alarm-definitions.md @@ -1,8 +1,8 @@ --- task: Acknowledgement types, areas of interest and alarm selection areas by quick load -version: R1.03 -source: IM 36K10L15-01EN §2.3.4, §4.1.2; IM 36K10C20-01EN §A5, §A8; practiced on CI-Eng-Sample 2026-10-01 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10L15-01EN §2.3.4, §4.1.2; IM 36K10C20-01EN §A5, §A8 (4th editions, Feb. 2026; content as in the 3rd editions, Sep. 2023); practiced on CI-Eng-Sample 2026-10-01 +status: verified on R1.03 (2026-10-01). R1.05 - the dataset definitions ALARM_ACK_DF, ALARM_AOI_DF and ALARM_ASA_DF are identical to R1.03 and the six predefined ack types are the same (checked 2026-10-08/09); the sample's CIENG_ACK, CIENG_TANKS and its ASA loaded and were removed with 0 errors in the reduced sample load on the R1.05 test server (2026-10-08; load check only - ASA listing, delete refusal and the error cases were not re-run) --- # Alarm definitions (quick load) @@ -96,8 +96,15 @@ NAME `dssqld -r` after the items that refer to them are removed or changed. -## Verified (CI-Eng-Sample, 2026-10-01) +## Verified (CI-Eng-Sample) -`CIENG_ACK`, `CIENG_TANKS` (number 2), `CIENG_TANK1` (`SECTION = "CI-Eng-Sample.TANK1"`, -compiled, valid) loaded and removed in a full sample remove/reload, 0 errors. A test ASA without -spaces was stored invalid and then removed. +- R1.03 (2026-10-01): `CIENG_ACK`, `CIENG_TANKS` (number 2), `CIENG_TANK1` + (`SECTION = "CI-Eng-Sample.TANK1"`, compiled, valid) loaded and removed in a full sample + remove/reload, 0 errors. A test ASA without spaces was stored invalid and then removed. +- R1.05 (2026-10-08, R1.05 test server): the same definitions loaded and were removed with + 0 errors in the reduced sample load. Only the load was checked. + +**Do not use the sample ASA in an alarm overview on a shared or production server.** An +alarm overview filtered by an ASA on `SECTION` or `UNIT` kept `ALH` at a full CPU core on the +shared R1.05 test server and made every other alarm list time out (ISS-136). Use such ASAs for +notification destinations or tests only, or filter overviews by item name or AOI. diff --git a/.claude/skills/alarm-management/tasks/item-alarming.md b/.claude/skills/alarm-management/tasks/item-alarming.md index e1892c9..fdbe614 100644 --- a/.claude/skills/alarm-management/tasks/item-alarming.md +++ b/.claude/skills/alarm-management/tasks/item-alarming.md @@ -1,8 +1,8 @@ --- task: Switch on alarming for an item, test an alarm, read and acknowledge alarms -version: R1.03 -source: IM 36K10L15-01EN §2.1–§2.3, IM 36K10C20-01EN §A2, §A5, §A12; IM 36K01A50 (ODBC acknowledge); practiced on CI-Eng-Sample 2026-10-01 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10L15-01EN §2.1–§2.3, IM 36K10C20-01EN §A2, §A5, §A12 (4th editions, Feb. 2026; content as in the 3rd editions, Sep. 2023); IM 36K01A50 §1.16 (ODBC acknowledge, unchanged in the 5th edition); IM 36K10C50-01EN §2.22, §4.12 (custom acknowledgement, R1.04+); practiced on CI-Eng-Sample 2026-10-01 +status: verified on R1.03 (2026-10-01). R1.05 - ITEM_DF alarm fields, STATUS_DF, ALARM_CURRENT and ALARM_CHRONO definitions identical to R1.03; the sample alarm on TANK1.LEVEL (ALARMING, CIENG_ACK, CIENG_TANKS) loaded with 0 errors on the R1.05 test server (2026-10-08, load check only). Raising, acknowledging, delaying and repeating an alarm were not re-tested on R1.05 (shared server). Custom acknowledgement with reason and approver - from docs, not tested (ISS-099). --- # Item alarming @@ -78,6 +78,25 @@ NAME,ACK not `ITEM_NAME` (same rule as the ODBC known issue, IM 36K01A50). Acknowledging is an operator action: only with the user's approval. +### 4.1 Acknowledge with a reason and an approver (R1.04 and later, from docs) + +From R1.04 an operator display can ask for a **reason** (up to 256 characters) and an +**approver** (up to 128 characters) when an alarm is acknowledged; both are stored in the audit +trail (`AUDIT_TRAIL` fields `APPROVAL_REASON` and `APPROVER`, present in the R1.05 data +dictionary). The ALARM Service itself is unchanged: the alarm datasets and setup files are the +same as on R1.03, and the acknowledgement still ends up as an `ACKNOW` event. Two ways, both +built in the Edit Module (skill `graphics`, `tasks/create-display.md`; C50 §2.22, §4.12): + +- the alarm overview's custom acknowledgement properties (*Use Custom Acknowledgement*, the + *External Acknowledgement* group with alarm key, approver, reason and trigger) — for item + alarms and external alarms; +- an *Update item/parameter* action on the item's *Acknowledged* attribute with reason and + approver — item alarms only. + +The record is written by the AUDIT Service, so check the audit settings (skill `audit-trail`). +Not tested on either version (ISS-099): it needs a display change, which is not allowed on the +shared R1.05 test server. + ## 5. Delay and repeat `DELAY` = d: DIRECT at once, DELAY after d seconds (same original time); back to normal earlier @@ -85,7 +104,7 @@ gives NORMAL and no DELAY. `REPEAT` = r: REPEAT every r seconds after the (delay `RPT_COUNT` 1, 2, …. The current alarm overview shows DIRECT only if `wfladi.sup` `EVENTS` contains `DIRECT` (not installed by default). -## Verified (CI-Eng-Sample `TANK1.LEVEL`, limits 10/20/80/90, ack type `CIENG_ACK` = MANUAL matrix) +## Verified on R1.03 (CI-Eng-Sample `TANK1.LEVEL`, limits 10/20/80/90, ack type `CIENG_ACK` = MANUAL matrix) | Step | Result | |---|---| @@ -99,3 +118,15 @@ contains `DIRECT` (not installed by default). | Full sample remove/reload | 0 errors; the alarm test passed again | No alarm line from `ALDPRT` appeared in `umhlog.log` (ISS-035). + +## R1.05 (R1.05 test server) + +- 2026-10-08: the reduced sample load switched on alarming for `TANK1.LEVEL` (`CIENG_ACK`, + `CIENG_TANKS`) with 0 errors and removed it again with 0 errors. This was a load check only: + no alarm was raised or acknowledged. +- 2026-10-09 (read-only): `ITEM_DF`, `STATUS_DF`, `ALARM_CURRENT` and `ALARM_CHRONO` definitions, + `alm.sup`, `aldprt.sup` and `wfladi.sup` (no `DIRECT` in `EVENTS`) are identical to R1.03, so + the steps above are expected to behave the same. Awaiting user verification: steps 2–5 on a + test item of a non-shared R1.05 system (expected results as in the table above). +- Read `ALARM_CHRONO` only with a filter on item name **and** a time range: big history reads + load the alarm storage process that all clients share (ISS-136). diff --git a/.claude/skills/audit-trail/SKILL.md b/.claude/skills/audit-trail/SKILL.md index 1f4033d..8a89fbe 100644 --- a/.claude/skills/audit-trail/SKILL.md +++ b/.claude/skills/audit-trail/SKILL.md @@ -1,20 +1,34 @@ --- name: audit-trail description: >- - CI Server R1.03 AUDIT Service and audit trail. Use when the user wants to know who changed + CI Server R1.05 AUDIT Service and audit trail. Use when the user wants to know who changed what and when (item value written, limit or description changed, item / section / object / report inserted or deleted, login, logout, failed login, alarm acknowledged or shelved), read or export the audit trail (AUDIT_TRAIL dataset, storage group ADT, old value / new value, user, - source HMI / LOC-ENG-MOD / ENT-ENG-MOD / OPER-INTERFACE / ODBC / QUICKLOAD), make an audit + approval reason and approver of a change (APPROVAL_REASON, APPROVER, FDA Part 11), source + HMI / LOC-ENG-MOD / ENT-ENG-MOD / OPER-INTERFACE / REST-SERVER / PYTOOLS / PASSWORD-CHECK / + ODBC / QUICKLOAD, PENDING item writes), make an audit report, switch auditing of an event type on or off (event classifiers, AUDIT_EVENT_CLAS_DF, STORAGE, "Audit trailing wanted" / AUDIT_INFO on an item), filter audit events (selection groups, AUDIT_SELGRP_DF, expression sbid / sbgp / user / nval), print or log audit events (ADTLOG event logger, adtsys.sup, E_LAYOUT, SEL_GROUP), check AUDIT Service (adtsto, adtcol, - adtdst, audit_start), or change how long the audit trail is kept (ADT lifetime). Source - IM 36K10L25-01EN. + adtdst, audit_start, ?*_audit_start.cmd extension scripts), or change how long the audit + trail is kept (ADT lifetime). Source IM 36K10L25-01EN. --- -# Audit trail (R1.03) +# Audit trail (R1.05) + +Re-checked on R1.05 on 2026-10-09 (read-only). IM 36K10L25 4th edition changed only its contact +information, but the installed software has grown (none of it is in the manual): +- `AUDIT_TRAIL` has two new fields, `APPROVAL_REASON` (256) and `APPROVER` (128), filled by + display writes that carry a reason and approver (IM 36K10C50 §2.22, §4.12; ISS-099, ISS-140). +- 499 classifiers instead of 463: new action `PENDING` and new sources `REST-SERVER`, `PYTOOLS`, + `PASSWORD-CHECK` (ISS-141). +- `audit_start.cmd` / `audit_stop.cmd` call extension scripts `?*_audit_start.cmd` / + `?*_audit_stop.cmd` (ISS-142). +Processes, `ADT` group, selection-group dataset and `adtsys.sup` keywords are otherwise as on R1.03. +Paths: read `TLS_*` (`set TLS`); on the R1.05 test server program and data are both under +`C:\Yokogawa\CIServer\tls`. Skill text still shows R1.03 paths where it names a full path. Background: `knowledge/manuals/IM36K10L25-01EN.md` (processes, classifiers, setup keywords, installed findings), `IM36K10G10-01EN.md` ch. 9 (overview), `IM36K10C40-01EN.md` (storage groups), @@ -33,7 +47,8 @@ Rules: | Task | File | Status | |---|---|---| -| Check AUDIT Service: processes, storage group `ADT`, classifier and selection group counts | `tasks/audit-checks.md` | verified | -| Read the audit trail: export, RQL query, audit report, what gets recorded by which tool | `tasks/read-audit-trail.md` | verified | -| Choose what is stored (classifier `STORAGE`), selection groups, event logger `ADTLOG` | `tasks/configure-audit.md` | verified (operator-side item value events from docs, ISS-049) | +| Check AUDIT Service: processes, storage group `ADT`, classifier and selection group counts | `tasks/audit-checks.md` | verified (R1.03); verified on R1.05 2026-10-09 (read-only) | +| Read the audit trail: export, RQL query, audit report, what gets recorded by which tool | `tasks/read-audit-trail.md` | verified (R1.03); on R1.05 RQL read, field list and sources checked 2026-10-09; the sample report load passed 2026-10-08 (load check only) | +| Approval reason / approver in the audit trail (`APPROVAL_REASON`, `APPROVER`) | `tasks/read-audit-trail.md` §1a | verified on R1.05 that the fields exist and are filled for operator writes; custom alarm acknowledgement not tested (display changes not allowed on the shared server) | +| Choose what is stored (classifier `STORAGE`), selection groups, event logger `ADTLOG` | `tasks/configure-audit.md` | verified (R1.03, incl. operator-side item value events, ISS-049); on R1.05 files and datasets checked, selection group load passed 2026-10-08; `ADTLOG` not re-run (starting processes not allowed on the shared server) | | Distributor process, extra collectors, new classifier entities in C | L25 summary §2, §5 | from docs | diff --git a/.claude/skills/audit-trail/tasks/audit-checks.md b/.claude/skills/audit-trail/tasks/audit-checks.md index ede64c6..0bdfc18 100644 --- a/.claude/skills/audit-trail/tasks/audit-checks.md +++ b/.claude/skills/audit-trail/tasks/audit-checks.md @@ -1,8 +1,8 @@ --- task: Check AUDIT Service (processes, storage group ADT, classifiers, selection groups) -version: R1.03 -source: IM 36K10L25-01EN §1.2, §2.1.1, §2.3.1, §4.1; practiced on the test system 2026-10-01 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10L25-01EN §1.2, §2.1.1, §2.3.1, §4.1 (4th ed., Feb. 2026; text unchanged from the 3rd ed.); practiced on the test system 2026-10-01 +status: verified on R1.03 (2026-10-01); verified on the R1.05 test server 2026-10-09 (read-only: processes, ADT group, classifier and selection group exports, start scripts, setup files) --- # AUDIT Service checks @@ -22,6 +22,13 @@ Default (`tls\com\audit_start.cmd`): `adtsto.exe` (storage, process `ADTSTO`) an `ADTSTO` creates it). `adtdst` (distributor), `adtlog` (event logger) and `adtcol02` are only in commented lines. Stop: `audit_stop.cmd` (`durstp` on `adt*`, admin). +R1.05 (verified 2026-10-09): same two processes running, `adtlog` and `adtdst` not running +(`durwfp` 1). New in R1.05: `audit_start.cmd` ends by calling every +`%TLS_ROOT_PATH%\tls\com\?*_audit_start.cmd`, and `audit_stop.cmd` calls every +`?*_audit_stop.cmd` **before** it stops the `adt*` processes (ISS-142; same hook pattern as the +other start scripts, ISS-121). Use such a file for your own additions (e.g. a permanent +`ADTLOG`) instead of editing the product script. Not described in IM 36K10L25. + ## 2. Storage group `ADT` ``` @@ -33,8 +40,8 @@ NAME,LIFE_TIME,ROLLOVER_INT,START_TIME,STOP_TIME,TYPE ``` `dssqld -e adt.qlo adt.qli`. History type 6 (audit). Manual default when `ADTSTO` creates it: -rollover 1 day, unit lifetime 2 days; the test system had **52 weeks** lifetime, rollover -1 day. While storage of `ADT` is stopped, new events are refused (logged via UMH). Unit +rollover 1 day, unit lifetime 2 days; the R1.03 test system and the R1.05 test server both had +**52 weeks** lifetime, rollover 1 day (type shown as `Audit` in the export). While storage of `ADT` is stopped, new events are refused (logged via UMH). Unit details: skill `history-management`, `history-checks.md`. ## 3. Classifiers and selection groups @@ -49,6 +56,16 @@ everything from source `COMPUTE` (PROCESS Service) on `ITEM`/`SUB-ITEM` values, quality, limits and deadband, and `DATASET.NULL-ATTR.*.COMPUTE`. No selection groups exist until you create one (the file `tls\dat\adt_sgp.dat` is created empty by `ADTSTO`). +R1.05 test server (2026-10-09): **499** classifiers, all `BASIC_SET` 1, **478** with `STORAGE` 1. +The 36 extra ones are exactly the new action and sources (ISS-141): `PENDING` on +`ITEM.VALUE` / `ITEM.STATUS` (sources `HMI`, `LOC-ENG-MOD`, `OPER-INTERFACE`, `OTHERS`, +`VIA-OPC-UAS`, `COMPUTE`), and `REST-SERVER`, `PYTOOLS`, `PASSWORD-CHECK` on `CI-SERVER` login / +logout / login attempt and `DATASET` insert / modify / delete, plus `ITEM.VALUE`, `STATUS`, +`QUALITY-CODE` `MODIFY` for `REST-SERVER` and `PYTOOLS`. Off: the same 19 `COMPUTE` +classifiers as on R1.03 plus `ITEM.VALUE.PENDING.COMPUTE` and `ITEM.STATUS.PENDING.COMPUTE`. +(463 + 36 = 499 and 19 + 2 = 21 off; the R1.03 list itself is not kept in the repo.) +No selection groups on the R1.05 test server. + Files: `%TLS_DAT_PATH%\adt_ecl.*` (classifiers), `adt_sgp.*` (selection groups); audit records are in the history files of group `ADT` (`%TLS_HIS_PATH%`). @@ -57,3 +74,8 @@ are in the history files of group `ADT` (`%TLS_HIS_PATH%`). Only `tls\sup\adtsys.sup` is installed (`QUESIZE = 200`, the rest commented): it is the keyword reference and template. A process reads a setup file named after itself (`adtsto.sup`, `adtcol01.sup`, `adtlog.sup` …) if present. Keywords: `configure-audit.md` §4 and the L25 summary. + +R1.05 (2026-10-09): `adtsys.sup` / `adtsys.tpl` differ from R1.03 only by two new `E_LAYOUT` +units `APPRR` (approval reason) and `APPR` (approver) (ISS-140). `adtini.sup` differs only in +the licence lines; `fmfprt.sup` and the `AUDIT_EVENT_CLAS_DF` / `AUDIT_SELGRP_DF` dataset +definitions are identical; `dssqld.sup` still has `NO-EXPORT=AUDIT_TRAIL`. diff --git a/.claude/skills/audit-trail/tasks/configure-audit.md b/.claude/skills/audit-trail/tasks/configure-audit.md index 8684bfc..3d411fb 100644 --- a/.claude/skills/audit-trail/tasks/configure-audit.md +++ b/.claude/skills/audit-trail/tasks/configure-audit.md @@ -1,8 +1,8 @@ --- task: Choose what AUDIT Service stores (classifier STORAGE, AUDIT_INFO), define selection groups, run an event logger (ADTLOG) -version: R1.03 -source: IM 36K10L25-01EN §2.4, §3, §4.2, App. 1; practiced on CI-Eng-Sample 2026-10-01 -status: verified (PROCESS-side ITEM.* events from docs) +version: R1.05 (first written for R1.03) +source: IM 36K10L25-01EN §2.4, §3, §4.2, App. 1 (4th ed., Feb. 2026); R1.05 `adtsys.sup`, `audit_start.cmd`; practiced on CI-Eng-Sample 2026-10-01 +status: verified on R1.03 (2026-10-01; PROCESS-side ITEM.* events from docs). R1.05: classifier list, setup file and start scripts checked 2026-10-09 (read-only); selection group CIENG_ITEMS loaded with 0 errors 2026-10-08 (load check only); STORAGE change, ADTLOG and the new APPRR / APPR layout units not tested on the shared server (awaiting user verification) --- # Configure the audit trail @@ -14,6 +14,9 @@ Each event type is a classifier `...` in `BASIC_SET`, `STORAGE`). Only `STORAGE` can be changed. Configuration and DSS value changes use subject `DATASET` with attribute `NULL-ATTR`, e.g. `DATASET.NULL-ATTR.MODIFY.LOC-ENG-MOD` (Engineering Module) or `….ENT-ENG-MOD` (`dssqld`); logins use `CI-SERVER.NULL-ATTR.LOGIN.`. +R1.05 adds action `PENDING` and sources `REST-SERVER`, `PYTOOLS`, `PASSWORD-CHECK` (499 +classifiers; list in `audit-checks.md` §3, ISS-141); the REST API, pyTOOLS and Password Check +events can be switched off like any other. List the classifiers (and which are off): `dssqld -e ecl.qlo -d AUDIT_EVENT_CLAS_DF`. Change: @@ -59,6 +62,8 @@ Expression language (from the compiler's own listing): - Words compared with a constant: `nval oval` (new / old value). - Operators `= != > < >= <=`, `and`, `or`, parentheses. **No `LIKE`**: match a name prefix with a range, e.g. `sbid >= "
." and sbid < "
/"` (`/` sorts right after `.`). +- R1.05: whether the compiler also accepts the new units `apprr` / `appr` was not tested + (compiling needs a load; awaiting user verification on a non-shared system). Example (`examples/CI-Eng-Sample/19_audit_df.qli`): @@ -94,16 +99,21 @@ Filtered logger: `examples/CI-Eng-Sample/audit/adtlogci.sup` (`SEL_GROUP = "CIEN `E_LAYOUT`, `TIMEFMT`, `HEADER`, `HEADER_AFTER`). The user copies it to `%TLS_ROOT_PATH%\tls\sup\` (admin); then `adtlog -n adtlogci` printed only the CI-Eng-Sample changes (no logins), one line each under the header. If the selection group does not exist or -did not compile, the logger logs an error and exits. To run it permanently, add a -`start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\adtlog -n ` line to `audit_start.cmd` (admin, -restart). +did not compile, the logger logs an error and exits. To run it permanently (admin, restart): +- R1.03: add a `start /B /NORMAL %TLS_ROOT_PATH%\tls\exe\adtlog -n ` line to + `audit_start.cmd`. +- R1.05: put that line in your own `tls\com\_audit_start.cmd` (e.g. + `cieng_audit_start.cmd`) and a matching `durstp` line in `_audit_stop.cmd`; + `audit_start.cmd` / `audit_stop.cmd` call every `?*_audit_start.cmd` / `?*_audit_stop.cmd` + (ISS-142). The product script stays untouched, so an upgrade does not lose the line. From the + installed scripts; not tested (needs admin and a restart). ## 4. Setup keywords (`adtsys.sup` is the template) `MAX_OPEN_UNITS` (20), `PRT_DEV`, `QUESIZE` (kB), `SEL_GROUP`; `COL_PROC`, `DST_PROC`, `HIS_PROC`, `STO_PROC` = `, `; `NODE_ECL_FILE`, `NODE_SGP_FILE`; `E_LAYOUT = ,,…` (`AAI1 ACND ACNM ACTM MAI1 NOND NONM NOTM NVAL NWLN OVAL REAS SACS SACT SATR SBGP SBID SPCE TERM -USER`), `E_NOSPACE`, `TIMEFMT` (`DD/MM/YY hh:mm:ss.ppp` default — milliseconds shown, as the +USER`; R1.05 adds `APPRR` approval reason and `APPR` approver, ISS-140), `E_NOSPACE`, `TIMEFMT` (`DD/MM/YY hh:mm:ss.ppp` default — milliseconds shown, as the manual says); `ECL_REFRESH` (1800 s), `FLOWC` (30, 10), `HBEAT` (10), `TRYCON` (10); `FORM_FEED`, `HEADER` (repeat for more lines), `HEADER_AFTER` (re-print after n events; the header is also printed once at start). Which keyword applies to which process: L25 §4.2.2. @@ -111,5 +121,5 @@ printed once at start). Which keyword applies to which process: L25 §4.2.2. ## 5. Retention Audit records live in history storage group `ADT` (rollover 1 day; lifetime 52 weeks on the -test system). Longer/shorter retention = change `LIFE_TIME` of `ADT` (skill +R1.03 test system and on the R1.05 test server). Longer/shorter retention = change `LIFE_TIME` of `ADT` (skill `history-management`); archive like any storage group. Ask before shortening it. diff --git a/.claude/skills/audit-trail/tasks/read-audit-trail.md b/.claude/skills/audit-trail/tasks/read-audit-trail.md index 4d7315d..b9fd26e 100644 --- a/.claude/skills/audit-trail/tasks/read-audit-trail.md +++ b/.claude/skills/audit-trail/tasks/read-audit-trail.md @@ -1,8 +1,8 @@ --- task: Read the audit trail (export, RQL query, audit report) and know what each tool records -version: R1.03 -source: IM 36K10L25-01EN §1.1, §2.1.2, §3.1, App. 1; IM 36K10G10-01EN ch. 9; practiced on CI-Eng-Sample 2026-10-01 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10L25-01EN §1.1, §2.1.2, §3.1, App. 1 (4th ed., Feb. 2026); IM 36K10C50-01EN §2.22, §4.12 (Feb. 2026); IM 36K10G10-01EN ch. 9; R1.05 `tls\src\audit_trail.dss`; practiced on CI-Eng-Sample 2026-10-01 +status: verified on R1.03 (2026-10-01); on the R1.05 test server 2026-10-09 (read-only) the dataset definition, an RQL read of the whole trail and the approval fields were checked; sample report CIENG_AUDIT loaded with 0 errors on 2026-10-08 (load check only, not generated) --- # Read the audit trail @@ -25,6 +25,37 @@ Read-only. Dataset `AUDIT_TRAIL` (storage group `ADT`); every field is read-only | `ACTION_NODE`/`ACTION_PROCESS`, `NOTIFICATION_NODE`/`NOTIFICATION_PROCESS` | Node and process (`DSSSDA00`, `JHMISET1086`, `DSSQLD00875` …) | | `OLD_VALUE`, `NEW_VALUE` | Text, max 64 characters (longer values are cut) | | `REASON`, `APPLICATION_INFO`, `APPLICATION_SUB` | Free text from the notifying program (empty in the tests) | +| `APPROVAL_REASON` (256), `APPROVER` (128) | **R1.05** (R1.04 and later): reason and approver name given with the change (see §1a); read-only, select only | + +### 1a. Approval reason and approver (R1.04 and later) + +Added for FDA 21 CFR Part 11 (the definition calls them *CPP* approval fields, a change to a +critical process parameter). IM 36K10L25 does not mention them (ISS-140); IM 36K10C50 does: +- An *Update item/parameter* action on a display (§4.12) can carry a **Reason** (≤ 256 + characters) and an **Approver** (≤ 128 characters), typed in or taken from display parameters. +- Alarm acknowledgement with reason and approver (§2.22): either through an item parameter + (attribute *Acknowledged* = 1, item alarms only) or through the alarm overview's + *External Acknowledgement* properties (*Alarm Key*, *Approver*, *Reason*, *Trigger*). Building + the display: skill `graphics`, `create-display.md`. + +Verified on the R1.05 test server (2026-10-09, read-only RQL): the fields exist in +`AUDIT_TRAIL`; 3 records out of about 15 500 had both filled, all `ITEM` `VALUE` `MODIFY` from +`OPER-INTERFACE` (an operator write), with `REASON` empty — so the reason goes to +`APPROVAL_REASON`, not to `REASON`. An alarm acknowledgement with reason / approver was **not +tested** (no such display; displays must not be changed on the shared server). Read them with: + +``` +column r as 'A40' heading 'Reason'; +column p as 'A20' heading 'Approver'; +select action_time, subject_group, subject_ident, subject_action, user_name, approver p, + approval_reason r + from audit_trail + where approver > ' ' or approval_reason > ' ' + order by action_time; +``` + +(`> ' '` finds non-empty text; this `where` clause was run on R1.05 with a shorter column list.) +On R1.03 these fields do not exist and the query fails. ## 2. What is recorded (verified on R1.03.00) @@ -42,6 +73,18 @@ So `AUDIT_INFO` matters only for operator (and PROCESS) writes; DSS changes are audited. The `SUBJECT_SOURCE` of a user interface comes from its *audit trail id* in `dssana.sup` `USER_INTERFACE` (Engineering Module = `LOC-ENG-MOD`). +**R1.05 additions** (ISS-141; classifiers verified 2026-10-09, behaviour not re-tested): +- Source `REST-SERVER`: the RESTful API (`jrstsrv`, skill `data-access`). The R1.05 test + server's trail holds `REST-SERVER` `LOGIN` / `LOGOUT` pairs and `MODIFY` records. +- Source `PYTOOLS`: the pyTOOLS Python module (IM 36K10P40). Not seen in the trail. +- Source `PASSWORD-CHECK`: the Edit Module *Password Check* function (IM 36K10C50 §2.31). Not seen. +- Action `PENDING` on `ITEM` `VALUE` / `STATUS`: per the R1.05 C header comments, for item writes + with a Vnet *on send* / *on receive* update policy (CENTUM). Not seen; not tested (no Vnet). + +Sources seen in the R1.05 test server's trail (2026-10-09, about 15 500 records): `ENT-ENG-MOD` +(most: `dssqld`), `LOC-ENG-MOD`, `OPER-INTERFACE`, `REST-SERVER`, `ENT-EDIT-MOD`, +`LOC-EDIT-MOD`, `HMI`, `DSS-CLIENT`, `VIA-OPC-UAS`. + ## 3. Export `dssqld -e` skips `AUDIT_TRAIL` in a full export (`NO-EXPORT` in `dssqld.sup`); name it: @@ -77,9 +120,14 @@ select action_time t, subject_group, subject_attribute, subject_action, subject_ ``` Use aliases with `COLUMN … AS 'A12'` to keep lines short (the fields are 16–256 characters -wide). Try it in the interactive generator (skill `reporting`, `rql-interactive.md`). The sample +wide). Try it in the interactive generator (skill `reporting`, `rql-interactive.md`): put the +query in a file that starts with `set @next 0;` and `set @page_size 0;` and ends with `exit;`, +then `rptgen -s rptgen.rpt < q.rql > q.out` in `cmd` (verified on R1.05 2026-10-09: one +heading line, a `====` line, then one line per record; the echoed `RPT>` prompts appear in the +output file). The sample report `CIENG_AUDIT` (`examples/CI-Eng-Sample/19_audit_df.qli`) lists the last hour of events on -`CI-Eng-Sample.*`; generate it like any ad-hoc report (`define-reports.md` §2). Generated from +`CI-Eng-Sample.*`; generate it like any ad-hoc report (`define-reports.md` §2). On R1.05 it +loaded with 0 errors (2026-10-08, reduced sample load); it was not generated there. Generated from `dssqld` it is stored but not printed (`FSL-E-PRT_UNKUSER`, ISS-045). In the Engineering Module, *Configuration › Reporting › Reports* holds the system reports diff --git a/.claude/skills/authorization/SKILL.md b/.claude/skills/authorization/SKILL.md index e7fa9a7..2641784 100644 --- a/.claude/skills/authorization/SKILL.md +++ b/.claude/skills/authorization/SKILL.md @@ -1,33 +1,49 @@ --- name: authorization description: >- - CI Server R1.03 users, authorization groups, login and schemes. Use when the user wants to + CI Server R1.05 users, authorization groups, login and schemes. Use when the user wants to create, list or remove CI Server users or authorization groups, choose authorization actions - (ITEM_READ, ITEM_MODIFY_VALUE, …), set process areas, logoff timeout or initial display for - a user, change how users log in (dssana.sup login method: Automatic, Manual CI Server, - Manual OS, No, SSO, Deny; no-login profile CI_NO_LOGIN), hide Engineering Module features - with a scheme, or connect CI Server to Active Directory (AD, domain users, security group or - OU mapping, directory group, profile priority, AD_INT_ON) and single sign-on for CI View - (SSO, SPNEGO, Kerberos, keytab, setspn, ktpass, kinit, krb5.ini). Sources IM 36K10C10-01EN §2, - IM 36K10J40-01EN. + (ITEM_READ, ITEM_MODIFY_VALUE, UA_MAPPER_PROJECT_*, …; up to 250 per group), set process + areas, logoff timeout or initial display for a user, give a user an API key for the RESTful + API (API_KEYS_DF, Add API Key), change how users log in (dssana.sup login method: Automatic, + Manual CI Server, Manual OS, No, SSO, Deny; no-login profile CI_NO_LOGIN; login methods for + RESTful API Server, Python Interface (pyTOOLS) and the Password Check Function), hide + Engineering Module features with a scheme, or connect CI Server to Active Directory (AD, + domain users, security group or OU mapping, directory group, profile priority, AD_INT_ON) + and single sign-on for CI View (SSO, SPNEGO, Kerberos, keytab, setspn, ktpass, kinit, + krb5.ini). Sources IM 36K10C10-01EN §2, IM 36K10J40-01EN. --- -# Authorization (R1.03) +# Authorization (R1.05) + +Re-checked on R1.05 on 2026-10-09 (read-only, no user or group changes): `USER_DF`, +`USER_VAL`, `SCHEME_DF`, `AUTH_ACTION_DF` definitions and the SSO/Kerberos templates are as in +R1.03. New in R1.04/R1.05: +- `AUTH_GROUP_DF` holds up to **250** actions (`ACTION_NAME_1…250`, was 200); an upgrade + utility `dss_ath_grp_u0104` converts the dataset on the first start after an upgrade (ISS-147). +- `AUTH_ACTION_DF` has 203 actions (R1.03: 200); new `UA_MAPPER_PROJECT_INSERT/MODIFY/DELETE` + for the OPC UA Information Model Mapper. There is no separate action for API keys, the + RESTful API or pyTOOLS (ISS-146). +- `dssana.sup` has three new user interfaces with their own login lines: *RESTful API Server*, + *Python Interface* (pyTOOLS), *Password Check Function* (ISS-148; `login-methods.md`). +- API keys per user for the RESTful API (`API_KEYS_DF`, ISS-151; `users-groups.md`). Background: `knowledge/manuals/IM36K10C10-01EN.md` §2 (login methods, actions, user tabs, -schemes), `IM36K10J40-01EN.md` (Active Directory, SSO). Login settings are in `dssana.sup` on CI Core (skill `portal-setup` for reading -and changing setup files). +schemes), `IM36K10J40-01EN.md` (Active Directory, SSO). Login settings are in `dssana.sup` on +CI Core (skill `portal-setup` for reading and changing setup files). RESTful API: skill +`data-access`; pyTOOLS: skill `pytools`; Password Check display function: skill `graphics`. Rules: - Run the `system-check` skill first; follow the user's chosen way of working. - Users are login accounts. Claude prepares user quick load files but the user loads them - and sets any password; never put real passwords in repo files. + and sets any password; never put real passwords or API keys in repo files. - Remove users before the authorization group they belong to. | Task | File | Status | |---|---|---| -| Create, check and remove authorization groups and users (quick load) | `tasks/users-groups.md` | verified | -| Login methods per client and user interface (`dssana.sup`, tab *Login control*); *No* login = full authorization when the profile user is missing | `tasks/login-methods.md` | verified (read; changes from docs) | -| Schemes (hide Engineering Module features) | C10 summary §2 | from docs | -| Active Directory integration and single sign-on (SPNEGO) | `tasks/active-directory.md` | from docs (no domain) | -| Password rules (`dssana.sup` *Password rules*: length, digits, punctuation, mixed case) | L50 summary §3 | from docs | +| Create, check and remove authorization groups and users (quick load) | `tasks/users-groups.md` | verified on R1.03; R1.05 definitions checked (2026-10-09), not re-loaded on the shared server | +| API key for a user (RESTful API) | `tasks/users-groups.md` § API key | from docs; dataset definition verified on R1.05 | +| Login methods per client and user interface (`dssana.sup`, tab *Login control*); *No* login = full authorization when the profile user is missing | `tasks/login-methods.md` | verified (read, R1.03 and R1.05); changes from docs | +| Schemes (hide Engineering Module features) | C10 summary §2 | from docs (R1.05: same three schemes, definition unchanged) | +| Active Directory integration and single sign-on (SPNEGO) | `tasks/active-directory.md` | from docs; not tested (no domain); R1.05 keywords and templates checked | +| Password rules (`dssana.sup` *Password rules*: length, digits, punctuation, mixed case) | L50 summary §3 | from docs (R1.05 help unchanged) | diff --git a/.claude/skills/authorization/tasks/active-directory.md b/.claude/skills/authorization/tasks/active-directory.md index 3ef3ba4..8b8bec2 100644 --- a/.claude/skills/authorization/tasks/active-directory.md +++ b/.claude/skills/authorization/tasks/active-directory.md @@ -1,8 +1,8 @@ --- task: Active Directory integration and single sign-on (SPNEGO) for CI Server -version: R1.03 -source: IM 36K10J40-01EN §1–§3, App. 1; dssana.sup AD/SSO keywords and auth\WEB-INF templates checked on the test system 2026-10-01 -status: from docs (no domain on the test system) +version: R1.05 (first written for R1.03) +source: IM 36K10J40-01EN 4th ed. (Feb. 2026) §1–§3, App. 1 (unchanged from the 3rd ed. apart from contact information); dssana.sup AD/SSO keywords and auth\WEB-INF templates checked on R1.03 (2026-10-01) and on the R1.05 test server (2026-10-09) +status: from docs; not tested (no Windows domain on either test system). R1.05: Active Directory and Single Sign On keywords, help texts and defaults identical to R1.03; auth\WEB-INF templates identical except web.xml.tpl (verified read-only 2026-10-09) --- # Active Directory and single sign-on @@ -59,9 +59,15 @@ Checklist (order matters): authentication on. 6. Test: temporarily enable the `test` servlet in `web.xml`, open `https://:8443/auth/test`, expect *Authorization scheme : SPNEGO*; restore - `web.xml`. + `web.xml`. On R1.05 the template `web.xml.tpl` no longer has the old Servlet 2.3 + `DOCTYPE` line (Servlet 3.1); the servlet entries are unchanged (ISS-153). 7. Start applications from the *Remote Connect* folder on CI View; the login methods `SSO` in *Login control* (installed default for most UIs) then log the user in without a prompt. +IM 36K10J40 does not mention the R1.04/R1.05 interfaces. Per IM 36K10J10 §2.9.1 the RESTful +API accepts *Manual CI Server* or *Manual OS* (the latter for domain users), and pyTOOLS only +*Manual CI Server*, so pyTOOLS scripts need a CI Server user with a password even when AD is on +(from docs; `login-methods.md`). + Common failures (manual): "realm not found" → fix `krb5.ini`; access by IP address or from the CI Portal machine itself → no SPNEGO; DNS reverse lookup missing → ticket errors. diff --git a/.claude/skills/authorization/tasks/login-methods.md b/.claude/skills/authorization/tasks/login-methods.md index 91ec06c..29aa433 100644 --- a/.claude/skills/authorization/tasks/login-methods.md +++ b/.claude/skills/authorization/tasks/login-methods.md @@ -1,8 +1,8 @@ --- task: Read and change login methods per client and user interface (dssana.sup Login control) -version: R1.03 -source: IM 36K10C10-01EN §2.2; IM 36K10J40-01EN §1.1, §2.10.3; dssana.sup help and installed values checked on the test system 2026-10-01 -status: verified (reading and the No-login behaviour; changing the file from docs — admin) +version: R1.05 (first written for R1.03) +source: IM 36K10C10-01EN 5th ed. (Feb. 2026) §2.2; IM 36K10J40-01EN 4th ed. (Feb. 2026) §1.1, §2.10.3; IM 36K10J10-01EN 5th ed. §2.9.1 (RESTful API, pyTOOLS); IM 36K10C50-01EN 5th ed. §2.31 (Password Check); dssana.sup help and installed values +status: verified on R1.03 (2026-10-01: reading and the No-login behaviour); R1.05 dssana.sup compared read-only with R1.03 on the R1.05 test server (2026-10-09); changing the file from docs (admin) --- # Login methods (`dssana.sup`, tab *Login control*) @@ -19,22 +19,48 @@ LOGIN_METHOD = , "", , , (any other); lines are evaluated top-down, ``/`` always last. - ``: the full name from the *User Interfaces* tab (`USER_INTERFACE = …`), e.g. `"Engineering Module"`, `"Edit Module"`, `"Operator Interface"`, `"Quickload Utility"`. + A user interface that is not listed there cannot connect at all. Its last field can name an + action the user's group must have (installed: Edit Module and Display/Symbol Utility need + `DISPLAY_MODIFY`). - ``: `Automatic` (Windows name = CI Server user, no password), `Manual CI Server`, `Manual OS`, `No`, `SSO`, `Deny`. -Installed (R1.03.00): local and remote Engineering Module, Edit Module, Operator Interface, Item -Search, Mobile Operator, Excel Add-in → `SSO` (falls back to *Manual CI Server* while SSO is not -set up); local Quickload / Display and Symbol Utility → `No`; remote Playback Viewer, Quickload, -Display/Symbol utilities → `Deny`; OPC UA server, ODBC, `dnetapi` → `Manual CI Server`; -anonymous OPC UA (local) → `No` with profile `CI_NO_LOGIN_OPCUAS`. +Installed (same on R1.03.00 and R1.05.00): local and remote Engineering Module, Edit Module, +Operator Interface, Item Search, Mobile Operator, Excel Add-in → `SSO` (falls back to *Manual +CI Server* while SSO is not set up); local Quickload / Display and Symbol Utility → `No`; +remote Playback Viewer, Quickload, Display/Symbol utilities → `Deny`; OPC UA server, ODBC → +`Manual CI Server`; anonymous OPC UA (local) → `No` with profile `CI_NO_LOGIN_OPCUAS`. + +**New in R1.04/R1.05** (verified in the R1.05 file, 2026-10-09; ISS-148): + +| User interface (abbreviation) | Used by | Installed method (local and remote) | Allowed methods (manual) | +|---|---|---|---| +| `RESTful API Server` (`JRSTSRV`) | RESTful API (skill `data-access`) | Manual CI Server | Manual CI Server or Manual OS (J10 §2.9.1) | +| `Python Interface` (`PYDSS`) | pyTOOLS (skill `pytools`) | Manual CI Server | Manual CI Server only (J10 §2.9.1) | +| `Password Check Function` (`JWUIPSWD`) | *Password Check* in display Generic Functions (skill `graphics`) | Manual CI Server | Manual CI Server or Manual OS (C50 §2.31) | + +The .NET API line was renamed: R1.03 had `LOGIN_METHOD = "", "dnetapi", …`, a name that +is not a defined user interface; R1.05 uses `"Application Interface"` (the `TLSVBCLIB` user +interface), still *Manual CI Server*. After an upgrade, check that these lines exist: a +`dssana.sup` carried over from R1.03 lacks them and the three new interfaces cannot log on +(ISS-149, not tested: no upgrade available). + +The other tabs (*General*, *Clients System Trust*, *Active Directory*, *Single Sign On*, +*Password rules*, *Logging*) and all help texts are unchanged in R1.05. `MAX_UI_PER_CLIENT` +(user interfaces per remote CI View) has help/factory default 5; the R1.05 test server has a +different active value, probably a local change (ISS-150). ## 2. *No* login — check the profile With `No` the user interface runs with the no-login profile (5th field). **If no CI Server user -with that name exists, the session gets full authorization** (`dssana.sup` help; verified -indirectly: `Quickload Utility` uses `No` with an empty profile and every `dssqld` change is -recorded in the audit trail as user `FULL AUTHORIZATION`). The installed lines name -`CI_NO_LOGIN`, which does not exist by default (only `CI_NO_LOGIN_OPCUAS` does). +with that name exists, the session gets full authorization** (`dssana.sup` help, unchanged in +R1.05; verified indirectly on R1.03: `Quickload Utility` uses `No` with an empty profile and +every `dssqld` change is recorded in the audit trail as user `FULL AUTHORIZATION`). The +installed lines name `CI_NO_LOGIN`, which does not exist by default (only `CI_NO_LOGIN_OPCUAS` +does). Manual (C10 §2.2, R1.05): now also names `CI_NO_LOGIN` (R1.03 manual: `FT_NO_LOGIN`), +but still says *no* profile is applied when that user is missing — the installed help is the +reference (ISS-018, ISS-125). *No* is only allowed for user interfaces on the CI Portal itself, +not for remote CI View. Before setting `No` for an operator UI: create user `CI_NO_LOGIN` with a restricted authorization group (`users-groups.md`) and a password, then change the method. @@ -45,3 +71,5 @@ Admin rights; hand to the user (skill `portal-setup`, `change-setup-file.md`). A line above the ``/`` lines (e.g. one HMI PC by host name), save, restart USER Service (or CI Server) for it to take effect. With **AD integration on** (`AD_INT_ON = YES`) the methods of the Edit and Engineering Modules are ignored: see `active-directory.md`. +For the Password Check function the method must be *Manual CI Server* or *Manual OS* (installed +default is fine); for pyTOOLS only *Manual CI Server* works. diff --git a/.claude/skills/authorization/tasks/users-groups.md b/.claude/skills/authorization/tasks/users-groups.md index cb1f84c..562f36f 100644 --- a/.claude/skills/authorization/tasks/users-groups.md +++ b/.claude/skills/authorization/tasks/users-groups.md @@ -1,8 +1,8 @@ --- task: Create, check and remove authorization groups and users with quick load -version: R1.03 -source: IM 36K10C10-01EN §2.4, §2.5; data dictionary (`dssqld -f`); practiced on the test system 2026-09-30 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10C10-01EN 5th ed. (Feb. 2026) §2.4, §2.5; IM 36K10L45-01EN 5th ed. §4.2.2 (API key); data dictionary (`dssqld -f`); practiced on the test system 2026-09-30 +status: verified on R1.03 (2026-09-30, 2026-10-06); on R1.05 the USER_DF, USER_VAL, AUTH_ACTION_DF definitions were checked identical and AUTH_GROUP_DF extended to 250 actions, AUTH_ACTION_DF and SCHEME_DF exported read-only (R1.05 test server, 2026-10-09); loading users and groups not re-tested on R1.05 (shared server, no user or group changes) --- # Authorization groups and users (quick load) @@ -21,13 +21,19 @@ dssqld -e actions.qli -d AUTH_ACTION_DF -c -l actions.lst ``` Installed on R1.03: groups `SYSTEM_MANAGER`, `ENGINEER`, `OPERATOR`, `GUEST`; users `ADMIN`, -`ADMINE`, `OPER`, `CI_NO_LOGIN_OPCUAS`. Passwords export as `****`. +`ADMINE`, `OPER`, `CI_NO_LOGIN_OPCUAS`. Passwords export as `****`. R1.05: the same four +factory groups (verified 2026-10-09); `AUTH_ACTION_DF` has 203 actions (R1.03: 200). ## Group -Required: `NAME`. Actions go in `ACTION_NAME_1`, `ACTION_NAME_2`, … and must be names from -`AUTH_ACTION_DF` (e.g. `ITEM_READ`, `ITEM_MODIFY_VALUE`, `SECTION_BLOCK_UNBLOCK`, -`ALARM_CURRENT_ACK`). Example (`examples/CI-Eng-Sample/08_auth_group_df.qli`): +Required: `NAME`. Actions go in `ACTION_NAME_1`, `ACTION_NAME_2`, … (up to `ACTION_NAME_250` on +R1.04 and later, 200 on R1.03) and must be names from `AUTH_ACTION_DF` (e.g. `ITEM_READ`, +`ITEM_MODIFY_VALUE`, `SECTION_BLOCK_UNBLOCK`, `ALARM_CURRENT_ACK`). New on R1.05: +`UA_MAPPER_PROJECT_INSERT`, `_MODIFY`, `_DELETE` (dataset `UASERVER_MAPPER_DF`, OPC UA +Information Model Mapper; no `_READ` action exists). The RESTful API, pyTOOLS and API keys +have no actions of their own: a REST or Python session has the rights of the user it logs on +as (ISS-146). A group with more than 200 actions cannot be moved back to R1.03, which has only +200 action fields. Example (`examples/CI-Eng-Sample/08_auth_group_df.qli`): ``` @FIELDS @@ -59,6 +65,22 @@ Defaults filled in on import (seen): display authorization level 999, language * playback *HMI Client dependent* / *No*, merge priority 1. Changes take effect at the user's next login. +## API key (RESTful API, R1.04 and later) + +The RESTful API needs, besides the user's name and password (HTTP Basic), an API key of that +user in the `x-api-key` header (IM 36K10L45 §4.2; skill `data-access`). The key is made in the +Engineering Module: *Authorisation › Users*, right-click the user, *Add API Key*: key name +(user name plus a hint that it is a RESTful key), description (≤ 79 bytes), *API Type* +*RESTful API*, *Request API key*. One key per user; the manual says requesting it again gives +the **same** key, so deleting and re-requesting does not replace a leaked key — change or +remove the user instead (ISS-151, not tested). + +Dataset `API_KEYS_DF` (verified definition, R1.05 2026-10-09): `NAME` = `:` +(≤ 64, upper case), `USER_NAME` (must exist in `USER_DF`), `API_KEY_NAME`, `DESCRIPTION`, +`API_TYPE` (only `RESTful API`). The key itself is **not** a field of the dataset, so it +cannot be exported or loaded with quick load; full exports skip `API_KEYS_DF` (ISS-118). +Create keys again on a new or restored system. Claude never reads, writes or stores API keys. + ## Check and remove Filtered export (`@SELECT`, see `system-management` task `export-dataset.md`): @@ -82,13 +104,13 @@ NAME "CIENG_VIEWER" ``` -## Test system (2026-09-30) +## Test system (R1.03, 2026-09-30) Group `CIENG_VIEWER` and user `CIENG_TEST` (no `PASSWORD` field, logoff 15 min) loaded with 0 errors, exported back as defined, then removed (1 + 1 removed, 0 errors). Logon was not tried; such a user cannot log on (see *User*). The group is part of CI-Eng-Sample. -## Sample user (2026-10-06) +## Sample user (R1.03, 2026-10-06) `examples/CI-Eng-Sample/08b_user_df.qli`: user `CIENG`, `PASSWORD ""`, factory group `OPERATOR`, `LAYOUT` `CIENG_Operator`, `INITIAL_DISPLAY` `CIENG_Overview`; logs on to that layout on the desktop @@ -101,3 +123,8 @@ USER_VAL*; logging out did not free it at once, and a retry in that state stoppe `DSSSDA03` (*DUR-F-BAD_SIZE, Negative size not allowed*; later requests failed with *DUR-F-UNKNOWN_ATT*) until CI Server was restarted (2026-10-06, ISS-073). After a restart the group was removed without error. `USER_VAL` exports only its header (no way to list sessions). +On R1.05 this was not repeated (it stops a DSS process; the server is shared). `USER_VAL` +and `AUTH_GROUP_DF` keep the same relation, but the DSS processes are arranged differently +(ISS-117), so treat ISS-073 as still valid until it is re-tested on a separate system (ISS-152). +The same applies to the password behaviour of ISS-072 (`USER_DF.PASSWORD` unchanged): keep +giving `PASSWORD ""` or setting the password in the Engineering Module. diff --git a/.claude/skills/class-object-engineering/SKILL.md b/.claude/skills/class-object-engineering/SKILL.md index 98b44ff..145b86e 100644 --- a/.claude/skills/class-object-engineering/SKILL.md +++ b/.claude/skills/class-object-engineering/SKILL.md @@ -1,17 +1,39 @@ --- name: class-object-engineering description: >- - CI Server R1.03 PROCESS Service: trigger groups, classes and objects. Use when the user wants + CI Server R1.05 PROCESS Service: trigger groups, classes and objects. Use when the user wants to create a trigger group, write, compile or change a class (Traditional PROCESS language or Java), use signals, attributes, prompts, timers or template items in a class, create objects from a class (with prompt answers), let an object create its own items, reset a class after a change, read or change object attribute values, see which item a signal uses, load or remove classes and objects with quick load files, or check PROCESS Service with opcdbg (database - check, object status, executor statistics). Sources IM 36K10L10-01EN, IM 36K10P10-01EN, - IM 36K10P11-01EN, IM 36K10G10-01EN (Tutorial). + check, object status, executor statistics), check the Java class API (fasttools.processfast, + createSection, Java runtime version) or the preinstalled system classes (AOG_BASE, AOG_JBASE, + PRC_STATUS_BASE, OPC UA method sample classes UAC_MTD_JBASE / UAS_MTD_JBASE with MTD_KEY / + MTD_TRG). Sources IM 36K10L10-01EN, IM 36K10P10-01EN, IM 36K10P11-01EN, IM 36K10G10-01EN + (Tutorial). --- -# Class and object engineering (R1.03) +# Class and object engineering (R1.05) + +Re-checked on R1.05 on 2026-10-09 (read-only): the three manuals only added contact +information (P11 §10.2 reworded, with one real fix: `createSection()` has no process-area +argument, ISS-154); dataset definitions (`CLASS_DF`, `OBJECT_DF`, `TRIGGER_DF`, +signal/attribute/reset datasets), `opc.sup`, `prc.sup`, the class source templates and the +Java logging files are identical to R1.03; the public Java API +(`fasttools.processfast`) is unchanged. The sample classes `CIENG_INCR`, `CIENG_TANK` and +`CIENG_JFLOW` loaded, compiled and ran on the R1.05 test server on 2026-10-08. + +What is new on R1.05 (details in the L10 / P11 summaries): +- Java runtime Temurin 11.0.28 (R1.03: 11.0.18); the Java PROCESS processes also load jars + from `tls\exe\lib`. +- `process_start.cmd` / `process_stop.cmd` call every `?*_process_start.cmd` / + `?*_process_stop.cmd` in `tls\com` (extension hook, as for the other services). +- Two more preinstalled Java classes, `UAC_MTD_JBASE` and `UAS_MTD_JBASE`: samples for OPC UA + methods (`MTD_KEY` attribute, `MTD_TRG` / `MTD_RET` / `MTD_IN_ARG_n` / `MTD_OUT_ARG_n` + signals). How to use them: skill `data-access`, task `opcua-client.md` §7 and the L45 + summary (§10.6, §11.4). Do not change or delete the preinstalled classes (also `AOG_BASE`, + `AOG_JBASE`, `PRC_STATUS_BASE`); derive or copy instead. Background: `knowledge/manuals/IM36K10L10-01EN.md` (processes, `opc.sup`, `opcdbg`, data store), `IM36K10P10-01EN.md` (Traditional language), `IM36K10P11-01EN.md` (Java), @@ -28,11 +50,12 @@ Rules: | Task | File | Status | |---|---|---| -| Trigger group, class (compiled on load) and object via quick load; compile errors; remove | `tasks/load-class-object.md` | verified | -| Traditional class with prompts/attributes, signals from the object's section, items created from a template, input check; change an attribute at runtime | `tasks/traditional-class.md` | verified | -| Java class: attach and create items, signal trigger, system log message | `tasks/java-class.md` | verified | -| Change a class that has objects: compile, reset with `opcdbg` | `tasks/change-reset-class.md` | verified (`dssqld` reset does not work, ISS-028) | -| `opcdbg` checks: database check, class/object details, object status, executor statistics, dumps | `tasks/opcdbg-checks.md` | verified | +| Trigger group, class (compiled on load) and object via quick load; compile errors; remove | `tasks/load-class-object.md` | verified (R1.03); load, compile, run and remove re-tested on R1.05 2026-10-08 | +| Traditional class with prompts/attributes, signals from the object's section, items created from a template, input check; change an attribute at runtime | `tasks/traditional-class.md` | verified (R1.03); class and created item re-tested on R1.05 2026-10-08, attribute change not re-tested | +| Java class: attach and create items, signal trigger, system log message | `tasks/java-class.md` | verified (R1.03); re-tested on R1.05 2026-10-08, API checked identical 2026-10-09 | +| Change a class that has objects: compile, reset with `opcdbg` | `tasks/change-reset-class.md` | verified (R1.03; `dssqld` reset does not work, ISS-028); not re-tested on R1.05 (awaiting decision, ISS-158) | +| `opcdbg` checks: database check, class/object details, object status, executor statistics, dumps | `tasks/opcdbg-checks.md` | verified (R1.03); database check and `OPCEXE1` statistics re-checked on R1.05 2026-10-09 | +| OPC UA method objects (`UAC_MTD_JBASE`, `UAS_MTD_JBASE`) | skill `data-access`, `opcua-client.md` §7; L45 summary | from docs; sample classes found installed on R1.05 (2026-10-09) | | Language reference (statements, operators, built-ins, DSS routines; Java API) | P10 / P11 summaries | from docs, main parts verified | -| `opc.sup` settings (executors, priorities, statistics, PRINT) | L10 summary §2 | read-only check; changing not practiced | +| `opc.sup` settings (executors, priorities, statistics, PRINT) | L10 summary §2 | read-only check (R1.03; identical on R1.05); changing not practiced | | Containment, inheritance, timers, alarms, STEP state machines, DSS routines | P10 / P11 summaries | from docs | diff --git a/.claude/skills/class-object-engineering/tasks/change-reset-class.md b/.claude/skills/class-object-engineering/tasks/change-reset-class.md index 6cd44f6..b809acf 100644 --- a/.claude/skills/class-object-engineering/tasks/change-reset-class.md +++ b/.claude/skills/class-object-engineering/tasks/change-reset-class.md @@ -1,8 +1,8 @@ --- task: Change a class that already has objects (compile and reset) -version: R1.03 -source: IM 36K10L10-01EN §4 (Reset class); IM 36K10P11-01EN §2.3, §10.4; practiced with CI-Eng-Sample class CIENG_TANK 2026-09-30 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10L10-01EN 4th ed. (Feb. 2026) §4 (Reset class); IM 36K10P11-01EN 4th ed. §2.3, §10.4; practiced with CI-Eng-Sample class CIENG_TANK 2026-09-30 +status: verified on R1.03 (2026-09-30, Engineering Module reset 2026-10-01). Not re-tested on R1.05; it needs the sample loaded again on the shared test server (awaiting decision, ISS-158). Manuals unchanged and CLASS_DF / CLASS_RESET_COMMAND definitions identical on R1.05 (2026-10-09), so the R1.03 results are expected to hold --- # Change a class that has objects diff --git a/.claude/skills/class-object-engineering/tasks/java-class.md b/.claude/skills/class-object-engineering/tasks/java-class.md index a6e533f..ddebeaf 100644 --- a/.claude/skills/class-object-engineering/tasks/java-class.md +++ b/.claude/skills/class-object-engineering/tasks/java-class.md @@ -1,8 +1,8 @@ --- task: Write and load a Java PROCESS Service class -version: R1.03 -source: IM 36K10P11-01EN §1–§5, §10; IM 36K10L10-01EN §1; practiced with CI-Eng-Sample class CIENG_JFLOW 2026-09-30 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10P11-01EN 4th ed. (Feb. 2026) §1–§5, §10; IM 36K10L10-01EN §1; practiced with CI-Eng-Sample class CIENG_JFLOW 2026-09-30 +status: verified on R1.03 (2026-09-30); re-tested on R1.05 2026-10-08 (CIENG_JFLOW compiled on load, sPerMin 2 for inflow 120, removed). Public API of fasttools.processfast compared with javap on 2026-10-09: identical to R1.03. systemMessage() output and the reset after a change were not re-tested on R1.05 --- # Java class @@ -77,7 +77,34 @@ refuse bad answers with `cancel("text")` in `create()`. (`change-reset-class.md`). - Deleting the object deleted `…JFLOW.sPerMin` and section `…TANK1.JFLOW`; `INFLOW` stayed. -## 4. Pitfalls (manual) +## 4. Java on R1.05 (checked 2026-10-09) + +- Runtime: the JDK in `%TLS_ROOT_PATH%\tls\jre` is Eclipse Temurin **11.0.28** (R1.03: + 11.0.18). Same Java 11 language level; write classes for Java 11. +- API: the public classes and methods of `fasttools.processfast` (in `tls\exe\jopcsrv.jar`) + are the same as on R1.03 (`javap -public`; the jar itself was rebuilt). +- `createSection(path, description, blocked, opcVisible)` takes **four** arguments on both + versions. The manual's examples pass a fifth (an empty process-area string) and would not + compile as printed; R1.05 §10.2 now describes it correctly (ISS-154; not compile-tested). +- The API has methods that P11 does not describe (ISS-159): `getHistory(...)` (item history + as `ValueSample[]`, several overloads), `defineIntegerAttributeForPrompt` / + `defineDoubleAttributeForPrompt` (P11 only names the String version), + `sendAndReceiveMessage(...)` (BUS request/reply) and `getDssSession()` (release notes). + Their behaviour is not documented here; test before relying on them. +- Extra jars: the Java PROCESS processes (`OPCJCOM`, `OPCJACT`, `OPCJEXE`) put `tls\exe\*` + and, on R1.05, also `tls\exe\lib\*` (bundled third-party jars) on the class path. + Your own library jar still goes in `tls\exe` (P11 §9). +- OPC UA methods (R1.04+): method objects are Java (or Traditional) objects with the + attribute `MTD_KEY` and signals `MTD_TRG`, `MTD_RET`, `MTD_IN_ARG_n`, `MTD_OUT_ARG_n`. The + installed sample classes are the starting point: `UAC_MTD_JBASE` (CI Server as OPC UA + client; prompts for the method key `:` and for the input and output + argument lists written as `/type/description`, type f, i, s or b, at most 10 each) and + `UAS_MTD_JBASE` (method offered by the CI Server OPC UA server; your logic runs when + `MTD_TRG` becomes 1 and must set the outputs, then `MTD_RET` if needed, then `MTD_TRG` 0 = + good or 2 = bad). Use one class with its own name per method object. Procedure: skill + `data-access`, `opcua-client.md` §7, and the L45 summary (§10.6, §11.4). Not practiced. + +## 5. Pitfalls (manual) - Definitions (`define…()`) only at class level, without `public`/`private`. - `create()`/`destroy()` run in a different process than the trigger methods: only attributes diff --git a/.claude/skills/class-object-engineering/tasks/load-class-object.md b/.claude/skills/class-object-engineering/tasks/load-class-object.md index 7ab7527..4e54199 100644 --- a/.claude/skills/class-object-engineering/tasks/load-class-object.md +++ b/.claude/skills/class-object-engineering/tasks/load-class-object.md @@ -1,8 +1,8 @@ --- task: Create trigger groups, classes and objects with quick load files -version: R1.03 -source: IM 36K10G10-01EN §5.1–5.3; IM 36K10L10-01EN §3; IM 36K10J10-01EN §5.6; practiced with CI-Eng-Sample 2026-09-30 (full remove/reload with three classes and objects) -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10G10-01EN §5.1–5.3; IM 36K10L10-01EN 4th ed. (Feb. 2026) §3; IM 36K10J10-01EN §5.6; practiced with CI-Eng-Sample 2026-09-30 (full remove/reload with three classes and objects) +status: verified on R1.03 (2026-09-30); on R1.05 the dataset definitions CLASS_DF / OBJECT_DF / TRIGGER_DF are identical (checked 2026-10-09) and the sample trigger group, classes CIENG_INCR / CIENG_TANK / CIENG_JFLOW and objects loaded with 0 errors, compiled, ran and were removed with 0 errors on the R1.05 test server (2026-10-08, reduced sample load). The compile-error path (COMPILE 0 then update) was not re-tested on R1.05 --- # Trigger groups, classes and objects via quick load @@ -120,4 +120,11 @@ Then `CLASS_DF`, then `TRIGGER_DF`. Deleting an object also deletes the items an created (verified); items it only attached stay. Example files: `examples/CI-Eng-Sample/05_trigger_df.qli`, `06_class_df.qli`, -`07_object_df.qli`, `86_` to `88_remove_*.qli`. +`07_object_df.qli`, `86_` to `88_remove_*.qli`. R1.05 accepts these `@VERSION 1.03.00` files +unchanged (2026-10-08). + +**System classes**: every installation already holds a few classes that are not yours: +`AOG_BASE`, `AOG_JBASE` (Advanced Operating Graphics), `PRC_STATUS_BASE` and, from R1.04, +the OPC UA method samples `UAC_MTD_JBASE` and `UAS_MTD_JBASE` (found on the R1.05 test +server 2026-10-09; skill `data-access`). Leave them alone: do not remove or recompile them +with a quick load, and filter exports on your own class names. diff --git a/.claude/skills/class-object-engineering/tasks/opcdbg-checks.md b/.claude/skills/class-object-engineering/tasks/opcdbg-checks.md index 00ffa84..46fef9f 100644 --- a/.claude/skills/class-object-engineering/tasks/opcdbg-checks.md +++ b/.claude/skills/class-object-engineering/tasks/opcdbg-checks.md @@ -1,8 +1,8 @@ --- task: Check PROCESS Service with opcdbg (database check, classes, objects, performance) -version: R1.03 -source: IM 36K10L10-01EN §4; practiced on the test system with CI-Eng-Sample 2026-09-30 -status: verified (read-only actions and Reset class) +version: R1.05 (first written for R1.03) +source: IM 36K10L10-01EN 4th ed. (Feb. 2026) §4; practiced on the test system with CI-Eng-Sample 2026-09-30 +status: verified on R1.03 (read-only actions and Reset class). On R1.05 (2026-10-09, read-only) the database check and the OPCEXE1 performance main info gave the same prompts and output layout; the Java executor statistics did not answer to piped input (ISS-157, awaiting user verification); the other actions were not re-run --- # PROCESS Service checks with `opcdbg` @@ -24,8 +24,14 @@ Only the actions below are read-only. Do not use insert/modify/delete, *Database | Object signals / attributes | `3` then `14` / `12`, object name | Signal → item id; attribute → type (LOCAL/GLOBAL) | | Executor statistics | `printf '0\nOPCEXE1\n1\n-1\n-1\n' \| timeout 20 opcdbg 0 4` | Active classes/objects/trigger groups/items, number of executions; times stay 0 unless `STATISTICS = YES` in `opc.sup` | -Executor names on R1.03: `OPCEXE1`…`OPCEXE4` (Traditional, priority ranges 0–249 … 750–999) -and `OPCJEXE` (Java). The prompt's default `OPCEXE` does not exist. +Executor names on R1.03 and R1.05 (same `opc.sup`): `OPCEXE1`…`OPCEXE4` (Traditional, +priority ranges 0–249 … 750–999) and `OPCJEXE` (Java). The prompt's default `OPCEXE` does +not exist. + +For `OPCJEXE` the piped command gave no output within 40 s on R1.05 (2026-10-09; the +debugger was stopped). Run it interactively: `opcdbg 0 4`, Enter (node 0), `OPCJEXE`, `1`, +then `-1` twice; expected: the same main-info block as for `OPCEXE1` (ISS-157). If it hangs, +close the window; nothing is changed. Easier for names: the datasets `OBJECT_SIGNAL_DF` (object:signal → item name) and `OBJECT_ATTR_VAL` / `CLASS_ATTR_VAL` (attribute values) via `dssqld -e` with a filter — see @@ -40,8 +46,12 @@ it** (`DSS-E-UNK_DS_NM`, ISS-027). To move classes and objects to another system `CLASS_DF` and `OBJECT_DF` with `dssqld -e` instead (task `load-class-object.md`; migration in `knowledge/manuals/IM36K10J10-01EN.md` §5.6). -## Observed on the test system +## Observed on the test systems -The database check reported one warning for a class `SINUS` (not from this repo) that was +R1.05 test server (2026-10-09): the database check read every store and reported no +warning; `OPCEXE1` main info listed active classes, objects, trigger groups and items and the +execution count, with all times 0 (`STATISTICS = NO`, as on R1.03). + +R1.03: the database check reported one warning for a class `SINUS` (not from this repo) that was never compiled; everything else was consistent. A class like that is harmless but can be compiled or removed by its owner. diff --git a/.claude/skills/class-object-engineering/tasks/traditional-class.md b/.claude/skills/class-object-engineering/tasks/traditional-class.md index f3884b7..ecca70b 100644 --- a/.claude/skills/class-object-engineering/tasks/traditional-class.md +++ b/.claude/skills/class-object-engineering/tasks/traditional-class.md @@ -1,8 +1,8 @@ --- task: Write a Traditional class with prompts, signals built from the object name, and items created from a template -version: R1.03 -source: IM 36K10P10-01EN §1–§5, §8, §10, §11.2.8; IM 36K10L10-01EN; practiced with CI-Eng-Sample class CIENG_TANK 2026-09-30 -status: verified +version: R1.05 (first written for R1.03) +source: IM 36K10P10-01EN 4th ed. (Feb. 2026) §1–§5, §8, §10, §11.2.8 (only contact information changed since R1.03); IM 36K10L10-01EN; practiced with CI-Eng-Sample class CIENG_TANK 2026-09-30 +status: verified on R1.03 (2026-09-30); re-tested on R1.05 2026-10-08 (CIENG_TANK compiled on load, TANK1.CALC.VOLUME created, level 50 gave volume 100, object removed with its items). Refused object, PRINT with %%, and the runtime attribute change (§3) were not re-tested on R1.05 --- # Traditional class: prompts, signals, created items diff --git a/.claude/skills/high-availability/SKILL.md b/.claude/skills/high-availability/SKILL.md index b38f40b..0e376eb 100644 --- a/.claude/skills/high-availability/SKILL.md +++ b/.claude/skills/high-availability/SKILL.md @@ -1,35 +1,50 @@ --- name: high-availability description: >- - CI Server R1.03 high availability with HAC (redundant servers). Use when the user asks about + CI Server R1.05 high availability with HAC (redundant servers). Use when the user asks about redundant / dual / triple / quad servers, primary and secondary server, active and standby, switchover (automatic or manual), the HAC HMI (hacw_hmi), watchdog, recovery (restart a process or tool, hacrec, -wdg_off), mirror / synchronization of the standby, journaling and key file repair (isfjrn, *.jrn), history merge after an island situation (hachmfcmd), hac.sup, - CI_PRIM, hacw_standby / hacw_stop scripts, HAC status items (SYSTEM.HAC1), hacitmval, HAC - firewall ports (UDP 16000-16006), hardware watchdog or custom health checks, or applying a + CI_PRIM, hacw_standby / hacw_stop scripts, extension scripts run on activate / deactivate + (?*_hacw_activate.cmd), HAC status items (SYSTEM.HAC1), hacitmval, HAC firewall ports + (UDP 16000-16006, HMI 16010-16041), hardware watchdog or custom health checks, or applying a patch to a redundant system. Source IM 36K10J20-01EN. --- -# High availability — HAC (R1.03) +# High availability — HAC (R1.05) + +Re-checked for R1.05 on 2026-10-09 (read-only, file and manual comparison only). The manual +(4th Edition, Feb. 2026) is unchanged apart from contact information; `hac.sup`, its template +and most HAC scripts are identical to R1.03. New on R1.05: `hacw_activate`/`hacw_deactivate` +call extension scripts `?*_hacw_activate.cmd`/`?*_hacw_deactivate.cmd` (ISS-160), and +`hacw_hmi` needs the `tls\exe\lib` folder (ISS-161). The R1.05 test server is a single, +non-redundant server without a HAC licence, so **all HAC behaviour is not tested on R1.05**. Background: `knowledge/manuals/IM36K10J20-01EN.md` (concepts, processes, set-up steps, installed `hac.sup` and the differences from the manual). Rules: -- Run `system-check` first; follow the user's chosen way of working. +- Run `system-check` first; follow the user's chosen way of working. Use the `TLS_*` + variables for paths (the install root differs between systems). - HAC needs its own licence and at least two servers with two separate networks between them. - Nothing here was practiced on a real redundant pair: say so when giving procedures. + Nothing here was practiced on a real redundant pair (R1.03 or R1.05): say so when giving + procedures. - `hac.sup`, the `tls\com` scripts and system variables need admin rights and a restart; hand them to the user (skill `portal-setup`, `change-setup-file.md`). - Never switch over, reboot or change a server's mode on a running plant without the user's explicit approval, and only when the mirror is consistent (see `redundant-setup.md` §3). - Do not start `hacrec` with `-wdg_off` on a server without reviewing its process list first: stand-alone Recovery acts (default action for most processes is `TOOL` = restart services). +- Do not run `hac*` tools on a system just to "look": even status commands talk to the HAC + processes. Read files and logs instead (`hac-checks.md`). +- Before recommending a design, check the release notes (IM 36K01A50): no mix of physical and + virtual machines in one HAC configuration (§1.19); after a HAC network-card switch, OPC UA + PubSub writers must be uploaded again (§1.15, R1.04 and later; ISS-162). | Task | File | Status | |---|---|---| -| Check HAC on a system: licence, processes, `hac.sup`, scripts, HMI properties, logs | `tasks/hac-checks.md` | verified (read-only, single server) | -| Set up and operate a redundant server pair: steps, `hac.sup` tabs, manual switchover, patching | `tasks/redundant-setup.md` | from docs | -| Recovery, logger and journaling on a stand-alone node | `tasks/standalone-recovery.md` | from docs | -| Dual-redundant Platform for Computer | — | not covered (separate product) | +| Check HAC on a system: licence, processes, `hac.sup`, scripts, HMI properties, logs | `tasks/hac-checks.md` | verified read-only on R1.03 (2026-10-01) and on the R1.05 test server (2026-10-09; single server, HAC not used) | +| Set up and operate a redundant server pair: steps, `hac.sup` tabs, manual switchover, patching | `tasks/redundant-setup.md` | from docs; not tested on R1.03 or R1.05 (no redundant pair); installed files compared on R1.05 | +| Recovery, logger and journaling on a stand-alone node | `tasks/standalone-recovery.md` | from docs; not tested (starting Recovery would act on the shared R1.05 test server); installed files compared on R1.05 | +| Dual-redundant Platform for Computer | — | not covered (separate product; precautions in the A50 summary §1.1) | diff --git a/.claude/skills/high-availability/tasks/hac-checks.md b/.claude/skills/high-availability/tasks/hac-checks.md index 8776bf4..0afa90f 100644 --- a/.claude/skills/high-availability/tasks/hac-checks.md +++ b/.claude/skills/high-availability/tasks/hac-checks.md @@ -1,13 +1,15 @@ --- task: Check HAC on a system (licence, processes, hac.sup, scripts, HMI properties, logs) -version: R1.03 -source: IM 36K10J20-01EN §1.3–§1.5, §2, §4.1.4, §6.1; checked read-only on the test system 2026-10-01 -status: verified (read-only, single unlicensed server) +version: R1.05 (first written for R1.03) +source: IM 36K10J20-01EN 4th Edition (Feb. 2026) §1.3–§1.5, §2, §4.1.4, §6.1 (unchanged since the 3rd Edition); checked read-only on the R1.03 test system 2026-10-01 and the R1.05 test server 2026-10-09 +status: verified read-only on R1.03 (2026-10-01) and on the R1.05 test server (2026-10-09), both single servers without HAC; the checks on a running pair (§3) are not tested (no redundant pair) --- # HAC checks -All read-only. +All read-only. Only read files, variables and the process list: do not run `hac*` tools +(`hacwcmd`, `hacitmval`, `hachmfcmd`, `hacwdg -d` …) just to check, they talk to (or start) +HAC processes. ## 1. Is HAC in use? @@ -18,8 +20,12 @@ All read-only. | Server number | `echo %CI_PRIM%` | 0 primary, 1 secondary, 2, 3 | | Processes | `tasklist /FI "IMAGENAME eq hac*"` | `hacwdg`, `hacrec`, `haclog`, `hacmir`, `hacwagt`, `hacwitm` run | -Test system (R1.03.00): no `hacini.sup`, normal `ci_start.cmd`, `CI_PRIM` unset, no `hac*` -process — HAC not used. +| Extension scripts (R1.05) | `dir %TLS_ROOT_PATH%\tls\com\*_hacw_*.cmd` | project scripts run on activate/deactivate (ISS-160) | + +R1.03.00 test system (2026-10-01) and R1.05.00 test server (2026-10-09): no `hacini.sup`, +normal `ci_start.cmd` (title *CI Server*), `CI_PRIM` and `TLS_BACKUP_PATH` unset, no `hac*` +process, no `*_hacw_*.cmd` — HAC not used. Note: `isfjrn` is started by `database_start.cmd` +on every node, so an `isfjrn` process alone does not mean HAC is used. ## 2. Configuration @@ -29,13 +35,22 @@ process — HAC not used. (a real router/switch with priority 1; **no `localhost`** in production), `START_MANUAL` (`NO` once commissioned), `RECOVERY_ON`, `JOURNAL_ON`, `HMF_DAYS`. The installed file is a template (`SERVER_A`, `192.168.1.1`, `localhost`, `START_MANUAL = - YES`): if these are still present the pair was never configured. + YES`): if these are still present the pair was never configured. The R1.05 `hac.sup`, + `hac_ees.sup`, `haccache.sup`, `hac.tpl` and `hac_ees.tpl` are identical to R1.03 (hash + comparison, 2026-10-08), so the template values and ISS-053 still apply. - `hac.sup` must be identical on all servers (it is excluded from the mirror on purpose). - HAC HMI: `%TLS_WAP_PATH%\cfg\jhacProperties\application.properties` — `primary=`, - `secondary=` (addresses of every network), `port1`/`port2` (16000), `logport` (16001). -- Firewall: UDP 16000–16006, TCP 34489 (history merge), ICMP between the servers. + `secondary=` (addresses of every network), `port1`/`port2` (16000), `logport` (16001), + `ownport`/`ownports` (16010, 32: the HMI's own UDP ports 16010–16041). Same file content + on R1.03 and R1.05 (2026-10-09). On R1.05 `hacw_hmi` also loads `tls\exe\lib\*`: the HMI + needs a complete CI Server installation on that machine (ISS-161). +- Firewall: UDP 16000–16006 between the servers, UDP 16010–16041 for HAC HMI stations, + TCP 34489 (history merge), ICMP between the servers. +- Extension scripts (R1.05): any `_hacw_activate.cmd` / `_hacw_deactivate.cmd` + in `tls\com` runs on every switchover; read them, they are part of the configuration and + must be the same on all servers (ISS-160). -## 3. State and logs (running pair) +## 3. State and logs (running pair; not tested — no redundant pair on R1.03 or R1.05) - HAC HMI: `hacw_hmi` (not in the start menu). Per server: responsive, operational status (Standby / Activating / Active / Deactivating), mode (Automatic / Manual), CI Server / custom / @@ -47,4 +62,5 @@ process — HAC not used. page), `hacmir.log`/`hacmir_old.log` (mirror), `%TLS_LOG_PATH%\hacw_standby.log`, `hacw_activate.log`, and `umhlog.log` (`HAC*`, `ISFJRN` messages; ISFJRN names the journal report `_jrn.lst` after an unclean shutdown). -- Watchdog start problems: `hacwdg -d` in a console shows initialization errors. +- Watchdog start problems: `hacwdg -d` in a console shows initialization errors (only on a + HAC server being commissioned, with the user's approval; it starts a Watchdog). diff --git a/.claude/skills/high-availability/tasks/redundant-setup.md b/.claude/skills/high-availability/tasks/redundant-setup.md index 648093e..0b3ebca 100644 --- a/.claude/skills/high-availability/tasks/redundant-setup.md +++ b/.claude/skills/high-availability/tasks/redundant-setup.md @@ -1,8 +1,8 @@ --- task: Set up and operate a redundant HAC server pair (steps, hac.sup tabs, switchover, patching) -version: R1.03 -source: IM 36K10J20-01EN §1.2–§1.5, §2.4–§2.6, §3, §4.3–§4.11, §6.4, §7; hac.sup and scripts checked on the test system 2026-10-01 -status: from docs (needs two licensed servers; not practiced) +version: R1.05 (first written for R1.03) +source: IM 36K10J20-01EN 4th Edition (Feb. 2026) §1.2–§1.5, §2.4–§2.6, §3, §4.3–§4.11, §6.4, §7 (unchanged since the 3rd Edition); IM 36K01A50-01EN 5th Edition §1.15, §1.19; IM 36K01C10-01EN §3.4; hac.sup and scripts checked on the R1.03 test system 2026-10-01 and compared with the R1.05 test server 2026-10-08/09 +status: from docs; not tested on R1.03 or R1.05 (needs two licensed servers, the R1.05 test server is a single server); R1.05 installed files compared read-only (hac.sup and hacw_standby/stop identical, hacw_activate/deactivate extension hooks and hacw_hmi classpath new) --- # Redundant server pair (HAC) @@ -21,6 +21,7 @@ the user applies them. the pair: same node number). - At least one real IP device per server for the network check (router/switch, priority 1). - CI Service start type *Automatic* (HAC reboots servers). +- All servers physical, or all virtual: never mix them in one HAC configuration (A50 §1.19). - `TLS_BACKUP_PATH` on a partition at least as large as `TLS_HIS_PATH` (the standby zips its runtime environment before each synchronization; without the variable the scripts use `TLS_LST_PATH`). @@ -33,6 +34,19 @@ the user applies them. `DATA1_STAT`, …, all Integer); stop CI Server. 3. `tls\com`: rename `ci_start.cmd`/`ci_stop.cmd` to e.g. `ci_start_old.cmd`/`ci_stop_old.cmd`, copy `hacw_standby.cmd` → `ci_start.cmd`, `hacw_stop.cmd` → `ci_stop.cmd`. + R1.05: `hacw_standby`/`hacw_stop` have **no** extension-script hook, so `?*_ci_start.cmd` / + `?*_ci_stop.cmd` scripts (ISS-121) no longer run once `ci_start`/`ci_stop` are replaced. The + service scripts that `hacw_activate`/`hacw_deactivate` call (`integration_start` …) still run + their own `?*_