From dc4d97bb611a769b4551d328af4b61f40228157b Mon Sep 17 00:00:00 2001 From: cliu Date: Thu, 1 Oct 2026 17:52:25 +1000 Subject: [PATCH 01/14] Issue review: test ISS-011, ISS-020, ISS-022, ISS-025; unlicensed shutdown after 1 h 10 min Co-Authored-By: Claude Opus 5.5 --- .../class-object-engineering/tasks/traditional-class.md | 3 ++- .claude/skills/item-engineering/tasks/block-item.md | 5 +++-- .claude/skills/system-check/SKILL.md | 2 +- .claude/skills/system-management/tasks/export-dataset.md | 2 ++ .../skills/system-management/tasks/load-remove-records.md | 4 ++++ knowledge/issues.md | 8 ++++---- knowledge/manuals/IM36K10P10-01EN.md | 2 +- 7 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.claude/skills/class-object-engineering/tasks/traditional-class.md b/.claude/skills/class-object-engineering/tasks/traditional-class.md index f77dae3..f3884b7 100644 --- a/.claude/skills/class-object-engineering/tasks/traditional-class.md +++ b/.claude/skills/class-object-engineering/tasks/traditional-class.md @@ -63,7 +63,8 @@ Object `CI-Eng-Sample.TANK1.CALC` with `ATTR_VALUE_1` = `"200"`: - `>=:` prints once when the level **crosses** 80 (message in `umhlog.log`, sender `OPCEXE1`). Rules learned on the test system: -- Do not put `%` in `PRINT` text: the message is cut at that point (ISS-025). +- A single `%` in `PRINT` text cuts the message at that point; write `%%` for a literal percent + sign (verified; `\%` does not work, ISS-025). - An object at root level has an empty `SECTION`; build names with an `IF` then (release notes). - Item names in `SIGNAL` strings must match exactly; an item that does not exist makes the object creation fail. diff --git a/.claude/skills/item-engineering/tasks/block-item.md b/.claude/skills/item-engineering/tasks/block-item.md index 706fa2e..7c48550 100644 --- a/.claude/skills/item-engineering/tasks/block-item.md +++ b/.claude/skills/item-engineering/tasks/block-item.md @@ -30,8 +30,9 @@ dssqld -m block.qli -l block.qlo ## Behaviour (verified on `CI-Eng-Sample.TANK1.INFLOW`) - Blocked: option flag `blk` appears in `itmval -g`; the status number is unchanged (stayed 9). -- `itmval -p -n -v ` on a blocked item is **silently ignored** (no error, value - unchanged; `knowledge/issues.md` ISS-011). Add `-o` to overwrite: +- `itmval -p -n -v ` on a blocked item is **silently ignored** (exit code 0, no + message, value unchanged); so is `dssqld -m` on `ITEM_VAL.ITEM_VALUE` (reports *Modified*, 0 + errors). Check `blk` in `itmval -g` before writing (`knowledge/issues.md` ISS-011). Add `-o` to overwrite: `itmval -p -n -v -o`. - After unblocking, `blk` is gone but `ublk` (option bit 16, *updated blocked*) remains: the item was written by an application (`itmval -o`) while it was blocked (IM 36K10C10 §3.5, diff --git a/.claude/skills/system-check/SKILL.md b/.claude/skills/system-check/SKILL.md index bc69542..f2c531b 100644 --- a/.claude/skills/system-check/SKILL.md +++ b/.claude/skills/system-check/SKILL.md @@ -71,7 +71,7 @@ prompt. Setup files (`*.sup`) are plain text (CRLF); edit them with the Setup Fi `tls\exe\ciserv.exe`). From a non-elevated shell `Start-Service StartCIServer` fails with "Cannot open StartCIServer service". Start it from an elevated prompt: `Start-Service StartCIServer` (or Services › CI Service › Start). -- **Unlicensed systems shut down after about 1 hour.** All CI Server processes exit, the +- **Unlicensed systems shut down about 1 hour 10 minutes after start.** All CI Server processes exit, the `StartCIServer` service still shows *Running*, and every tool fails with `umh_panic: , license expired`. To recover, **stop then start** the CI Service (elevated): `Stop-Service StartCIServer` then `Start-Service StartCIServer`. Before a long diff --git a/.claude/skills/system-management/tasks/export-dataset.md b/.claude/skills/system-management/tasks/export-dataset.md index 646ec93..d613d33 100644 --- a/.claude/skills/system-management/tasks/export-dataset.md +++ b/.claude/skills/system-management/tasks/export-dataset.md @@ -18,6 +18,8 @@ dssqld -e .qli -d -c -l .lst - `-d` dataset name (e.g. `ITEM_DF`, `STATUS_DF`, `LOCAL_NODE_DF`, `CLASS_DF`, `OBJECT_DF`). - `-c` comma-separated output: first line is the field names, then one quoted row per record. - `-l` writes the result summary to a listing file. +- Output path **≤ 79 characters**: a longer `-e` path gives no error, but the file does not + appear under that name (verified, ISS-020). - `-a` also exports hidden fields. The console (and listing) end with a summary; check `Errors` is 0: diff --git a/.claude/skills/system-management/tasks/load-remove-records.md b/.claude/skills/system-management/tasks/load-remove-records.md index 70d50f9..79ebb02 100644 --- a/.claude/skills/system-management/tasks/load-remove-records.md +++ b/.claude/skills/system-management/tasks/load-remove-records.md @@ -47,6 +47,10 @@ dssqld -i .qli -l .qlo Summary per dataset: `Recognized`, `Imported`, `Exists` (already present, left unchanged), `Errors`. Check `Errors` is 0; the `.qlo` listing holds the same result. +File names: the whole path must be **≤ 79 characters** (verified; longer input paths fail with +`DSSQ-E-Q_QLIEXT` or `CRL-E-ENOENT`). Run `dssqld` from the file's folder with relative names. +ISS-020. + ## Update (modify) ``` diff --git a/knowledge/issues.md b/knowledge/issues.md index 427367a..bff11e8 100644 --- a/knowledge/issues.md +++ b/knowledge/issues.md @@ -30,7 +30,7 @@ development system (see "Test system" in `progress.md`); they do not exist on ot | ISS-009 | 2026-09-30 | Security Guide | DCOM port range printed as 20500–20550 in the firewall table but "2500–20550" in the OPC configuration table. Taken as a typo for 20500–20550. | open | Confirm on a system with IT security applied. | `knowledge/manuals/IM36K01C30-01EN.md` §4 | | ISS-010 | 2026-09-30 | ITEM (sub-items) | The Integrator sub-item adds value × seconds; setting `TIME_UNIT` = Hour made no difference (1 per second while the main item was 1). The Tutorial lists a time unit only for Rate-of-Change. | closed | 2026-09-30 (phase 5): IM 36K10C10 §3.2 and `itm.sup` answer it: the integral is divided by the **integration granule** `itm_int_secs` (label "Integration granule, sec.") in `itm.sup` — **system-wide**, installed value 1 (seconds); 60 = minutes, 3600 = hours. `TIME_UNIT` only applies to Rate-of-Change. Practiced 2026-09-30: set to 60 and restarted → `CI-Eng-Sample.PUMP1.RUNNING.RUN_SECONDS` rose exactly 1.0 in 60 s; restored to 1 (file identical to backup) → 8 in 8 s. Existing integrator values are not converted when the granule changes. Closed 2026-09-30 (confirmed by user). | `examples/CI-Eng-Sample/02b_sub_item_df.qli`; `knowledge/manuals/IM36K10G10-01EN.md` | -| ISS-011 | 2026-09-30 | ITEM (blocking) | A write to a blocked item with `itmval -p` (without `-o`) is silently ignored: no error message, value unchanged. | open | Check in phase 5 whether any status/return code signals this. | `.claude/skills/system-management/tasks/read-write-item.md` | +| ISS-011 | 2026-09-30 | ITEM (blocking) | A write to a blocked item with `itmval -p` (without `-o`) is silently ignored: no error message, value unchanged. | open | Tested 2026-10-01 (phase 12 issue review): nothing signals it. `itmval -p` on a blocked item exits with code 0 and prints nothing; `dssqld -m` on `ITEM_VAL.ITEM_VALUE` reports *Modified 1, Errors 0*; the value stays unchanged in both cases. Only the `blk` option flag (`itmval -g`) shows the item is blocked. Documented: check `blk` before writing. Close when the user confirms. | `.claude/skills/system-management/tasks/read-write-item.md` | | ISS-012 | 2026-09-30 | CI Portal setup files | IM 36K10R10 §4.4 names the alarm item/display relation setup file `wfla_displays.sup`; the installed file is `wfla_display.sup` (no `s`). | closed | Closed 2026-09-30 (user decision: the installed software and files are the reference). The repo uses `wfla_display.sup`. | `knowledge/manuals/IM36K10R10-01EN.md` §4; `.claude/skills/portal-setup/tasks/read-setup-file.md` | | ISS-013 | 2026-09-30 | CI Portal setup files | Installed values differ from the defaults stated in IM 36K10R10 §4.4: `wfla_display.sup` `DUR_QUEUE_SIZE = 1000` (manual 500 kB); `wflgdi.sup` `DUR_QUEUE_SIZE = 252` (manual 1000 kB); `wfla_display.sup` and `wflcdi.sup` set `TIMER_INTERVAL = 10` (manual: 1 s when not set). | closed | Closed 2026-09-30 (user decision: the installed software and files are the reference). The repo quotes the installed values as defaults. | `knowledge/manuals/IM36K10R10-01EN.md` §4 | | ISS-014 | 2026-09-30 | CI Portal setup files | `jwuiisg.sup` has a *Security* tab (`SECURITY_ENABLED`, `CORS_ENTRY`, `HEADER_ENTRY`) that IM 36K10R10 §4.3 does not describe. | closed | Closed 2026-09-30 (user decision: the installed software and files are the reference). Documented from the file's own `!KEYWORD`/`!HELP` text. Installed CORS allows all origins (`allowedOrigins "*"`); tightening it is a site security decision. | `knowledge/manuals/IM36K10R10-01EN.md` §4.3 | @@ -39,12 +39,12 @@ development system (see "Test system" in `progress.md`); they do not exist on ot | ISS-017 | 2026-09-30 | CI Portal setup files | IM 36K10R10 §4 says the logon method is the one user-interface setting normally changed, but the R1.03 `jwuiisg.sup` *Information* tab says the login method and login control settings have moved to `dssana.sup` (authentication and authorization). `dssana.sup` is not described in R10. | open | Installed software is the reference. 2026-09-30: `dssana.sup` ("Authentication and authorization setup") has tabs General, User Interfaces, Clients System Trust, Login control (`LOGIN_METHOD = , , , …`), Active Directory, Single Sign On, Password rules, Logging. Manuals mentioning it: IM 36K01A50 (5×), 36K10C10 (6×), 36K10J40 (13×), 36K10L45 (2×), 36K10L50 (3×). Cover it in phase 5 (C10) and phase 13 (J40). 2026-09-30: login methods (Automatic, Manual CI Server, Manual OS, No, SSO, Deny) now summarized from C10 §2.2 in `knowledge/manuals/IM36K10C10-01EN.md`; AD/SSO details remain for J40. | `knowledge/manuals/IM36K10R10-01EN.md` §4; `.claude/skills/portal-setup/SKILL.md` | | ISS-018 | 2026-09-30 | Authorization (`dssana.sup`) | IM 36K10C10 §2.2 says the *No* login method applies the user profile `FT_NO_LOGIN`; the installed `dssana.sup` names `CI_NO_LOGIN` (and `CI_NO_LOGIN_OPCUAS` for anonymous OPC UA) as the no-login profile. `USER_DF` on the test system has `CI_NO_LOGIN_OPCUAS` but no `CI_NO_LOGIN`. | open | Installed software is the reference: use `CI_NO_LOGIN`. Still to check: behaviour of a *No* login when that user does not exist (manual: no profile applied). Covered again in phase 13 (IM 36K10J40). | `knowledge/manuals/IM36K10C10-01EN.md` §2 | | ISS-019 | 2026-09-30 | ITEM (string items) | Maximum string item length differs by source: IM 36K10C10 §3.3.4 says default 80, max 100; the Tutorial summary says up to 168 without audit; the data dictionary (`dssqld -f`) gives `ITEM_DF.STRING_LENGTH` range 1–200, default 80. | closed | Tested 2026-09-30 on CI-Eng-Sample (`dssqld -i`, `itmval -p/-g`, non-elevated): `STRING_LENGTH` 100, 168 and 200 load with or without `AUDIT_INFO`; 201 fails with `DSS-E-VAL_RANGE`. An item holds **length − 1** characters: a 99-character value in a length-100 item is stored with status 9 NORMAL; longer values are cut to length − 1 with status **12 OVERRANGED** (100 → 99, 200 → 199, 201 → 199). So the data dictionary (1–200) is right. Test items removed. Closed 2026-09-30 (confirmed by user). | `knowledge/manuals/IM36K10C10-01EN.md` §3; `knowledge/manuals/IM36K10G10-01EN.md` (items); `.claude/skills/item-engineering/SKILL.md` | -| ISS-020 | 2026-09-30 | DATABASE (`dssqld`) | `dssqld -i "\user.qli"` failed with `CRL-E-ENOENT` / `DSSQ-E-QLD_FILOPN`: the path in the message was cut after 79 characters (`…\73b3559a-12.`). A relative file name from the same folder works. Similar to the `intspawn` path limit (ISS-007). | open | Find the exact limit (79/80 characters?) and whether `-l` and `-e` paths are also cut. Until then: `cd` to the folder and use short relative names. | `.claude/skills/system-management/tasks/load-remove-records.md`; `.claude/skills/system-management/tasks/export-dataset.md` | +| ISS-020 | 2026-09-30 | DATABASE (`dssqld`) | `dssqld -i "\user.qli"` failed with `CRL-E-ENOENT` / `DSSQ-E-QLD_FILOPN`: the path in the message was cut after 79 characters (`…\73b3559a-12.`). A relative file name from the same folder works. Similar to the `intspawn` path limit (ISS-007). | open | Tested 2026-10-01: the limit is **79 characters** for the whole path. An input file of 80–81 characters gives `DSSQ-E-Q_QLIEXT` (the name is cut, e.g. `….ql`), 85+ gives `CRL-E-ENOENT`. An `-e` output path of 80+ characters gives **no error**, but no file appears under the given name. Documented: keep paths ≤ 79 characters, or `cd` to the folder and use relative names. Close when the user confirms. | `.claude/skills/system-management/tasks/load-remove-records.md`; `.claude/skills/system-management/tasks/export-dataset.md` | | ISS-021 | 2026-09-30 | EQUIPMENT (`eqpiostat`) | IM 36K10L40 §2 says `eqpiostat` stores hourly I/O statistics per station line in "history group STATION_STAT". On the test system `eqpiostat` runs (started by `equipment_start.cmd` on the host node) and `STATION_STAT` is a dataset, but `dssqld -e` returned 0 records, also with filters on `TIME_STAMP` and `STATION` (AID Modbus stations, which send requests). | open | Check whether records appear after a full hour with a communicating station, or whether the dataset is read another way (e.g. Engineering Module, report). | `knowledge/manuals/IM36K10L40-01EN.md` §2 | -| ISS-022 | 2026-09-30 | ITEM (`itmval -f`) | `itmval -f vs -n CI-Eng-Sample.TANK1.LEVEL` (IM 36K10L36 §1.4, write a restore command) crashes with a segmentation fault (bash) / access violation 0xC0000005 (PowerShell) and writes no file; also with `-l`. The manual's space-separated form `-n ` is rejected with `FSL-E-NARG_ALL`. `itmval -g`/`-p` work. | open | Workaround: build restore lines from `itmval -g` output. Report to Yokogawa support if needed. | `knowledge/manuals/IM36K10L36-01EN.md` §3; `.claude/skills/system-management/tasks/read-write-item.md` | +| ISS-022 | 2026-09-30 | ITEM (`itmval -f`) | `itmval -f vs -n CI-Eng-Sample.TANK1.LEVEL` (IM 36K10L36 §1.4, write a restore command) crashes with a segmentation fault (bash) / access violation 0xC0000005 (PowerShell) and writes no file; also with `-l`. The manual's space-separated form `-n ` is rejected with `FSL-E-NARG_ALL`. `itmval -g`/`-p` work. | open | Workaround: build restore lines from `itmval -g` output. Report to Yokogawa support if needed. Retested 2026-10-01 with the documented syntax `itmval -f -n ` (`` = letters from `vsqo`, e.g. `vs`): still a segmentation fault from bash and from `cmd`, in a short and a long folder, relative or absolute file name; `cmd` leaves an **empty** file. Treat `-f` as broken on R1.03.00. | `knowledge/manuals/IM36K10L36-01EN.md` §3; `.claude/skills/system-management/tasks/read-write-item.md` | | ISS-023 | 2026-09-30 | ITEM / ITH (manual vs install) | Installed ITEM Service differs from IM 36K10L35/L36: `item_start.cmd` starts `itheix` (EVENT/ITEM storage, not described), aggregation `ithsag`/`ithrag`, two instances of each retrieve process, and `itmtim 100 1000 1 200 1` (five arguments, three documented); `itm.sup` item pool is 650000 KB (manual default 50000) and has `not_regained` (not described); `itheix.sup` has `max_sample_delay`, `max_samples_queued`, `max_open_files`. | closed | Closed 2026-09-30 (user decision: the installed software is the reference). Summaries describe the installed values. | `knowledge/manuals/IM36K10L35-01EN.md`; `knowledge/manuals/IM36K10L36-01EN.md` | | ISS-024 | 2026-09-30 | EQUIPMENT (Modbus slave) | IM 36K10L41 §3.7 says `EQPMDCSLVTCP` waits for "MODBUS RTU requests via TCP/IP" and the CI Server master should use "MODBUS RTU via TCP/IP". A Modbus master station with `PROTOCOL = RTU` to `eqpmdcslvtcp` (port 5020) got no answer (`EQP-E-TCPRCVTMO`, 4 requests, 0 valid); with `Open Modbus/TCP` it worked at once. | closed | Closed 2026-09-30 (user decision: installed software is the reference). Use `Open Modbus/TCP` towards `eqpmdcslvtcp`. | `knowledge/manuals/IM36K10L41-01EN.md` §3.7; `.claude/skills/equipment/tasks/modbus-station.md` | -| ISS-025 | 2026-09-30 | PROCESS (PRINT) | A Traditional `PRINT "… 80 %, volume ", VOLUME;` logged `OPC-I-INFO, UMH Message Text Error: Message number 083A001B (… level reached 80 )`: the text is cut at the `%` and the rest is lost. Without `%` the full text is logged. | open | Avoid `%` in PRINT/ERROR text (sample uses "pct"). Check whether `%%` or `\%` gives a literal percent sign. | `knowledge/manuals/IM36K10P10-01EN.md` §4; `.claude/skills/class-object-engineering/tasks/traditional-class.md` | +| ISS-025 | 2026-09-30 | PROCESS (PRINT) | A Traditional `PRINT "… 80 %, volume ", VOLUME;` logged `OPC-I-INFO, UMH Message Text Error: Message number 083A001B (… level reached 80 )`: the text is cut at the `%` and the rest is lost. Without `%` the full text is logged. | open | Tested 2026-10-01 with a temporary class (removed): `PRINT "… 50 %% …"` logs `50 % …` correctly; `\%` and `%c` with 37 both give the *Message Text Error* and cut the text. Documented: write `%%`. Close when the user confirms. | `knowledge/manuals/IM36K10P10-01EN.md` §4; `.claude/skills/class-object-engineering/tasks/traditional-class.md` | | ISS-026 | 2026-09-30 | PROCESS (`opc.sup`) | Installed PROCESS setup differs from IM 36K10L10 §2: `IMMED-EVENTS = NO` (manual: default on); `FLOW-CONTROL = 30,60` (manual 300/360 s); four executors `OPCEXE1`–`4` with fixed priority ranges (manual examples `OPCEXE01`…) and `opcdbg` still defaults to `OPCEXE`; keyword `VARTAB-SIZE` (manual `VARITAB-SIZE`); hidden keywords `FLDSEP`, `IGNEXI` not described; `ALARM-ITEMS` not set; class source file `opc_clssrc.dat` (manual `opc_clasrc.dat`); `opcini.sup` (licence line) not described. | open | Installed software is the reference (standing user decision); summary written from the installed files. Close when the user confirms. | `knowledge/manuals/IM36K10L10-01EN.md` §2, §5 | | ISS-027 | 2026-09-30 | PROCESS (`opcdbg`) | IM 36K10L10 §4 says the `opcdbg` *Dump classes/objects* files can be read by `dssqld`. The files have no `@LANGUAGE`/`@FIELDS`/`@` headers (`NAME,"desc",prio` + source lines prefixed `- `); `dssqld -i` on the object dump gave `DSS-E-UNK_DS_NM, Unknown data set name`. | open | Use `dssqld -e CLASS_DF` / `OBJECT_DF` for transfers. Maybe an old tool reads the dump format; not found. | `knowledge/manuals/IM36K10L10-01EN.md` §4; `.claude/skills/class-object-engineering/tasks/opcdbg-checks.md` | | ISS-028 | 2026-09-30 | PROCESS (class reset) | After recompiling a class with objects (`RESET_REQUIRED` 1), `dssqld -m` with `CLASS_DF` `RESET` = 1 (also with `RESET_NODE` = host node name) is accepted with 0 errors but does not reset; `OBJECT_DF` `RESET` = 1 is refused (`OPC-E-OBJ_RSTREQ`). `opcdbg` Classes → 8 *Reset class* works; it asks for a reset report file, which the manual does not list. | open | Use `opcdbg`. Still to try: `CLASS_RESET_COMMAND` (system-wide) and the Engineering Module's reset. | `.claude/skills/class-object-engineering/tasks/change-reset-class.md`; `knowledge/manuals/IM36K10L10-01EN.md` §4 | diff --git a/knowledge/manuals/IM36K10P10-01EN.md b/knowledge/manuals/IM36K10P10-01EN.md index 0e01318..f400377 100644 --- a/knowledge/manuals/IM36K10P10-01EN.md +++ b/knowledge/manuals/IM36K10P10-01EN.md @@ -108,7 +108,7 @@ SIGNAL VOLUME := FROM "