ci-server-engineer/knowledge/manuals/IM36K10L25-01EN.md
cliu bf7d88a027 R1.05 re-check batch 3: alarms, audit, authorization, classes, HAC, reporting, pyTOOLS
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 <noreply@anthropic.com>
2026-10-09 10:21:36 +11:00

186 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
manual: IM 36K10L25-01EN
title: Audit Trail Management Engineering
edition: 4th Edition, Feb. 2026 (R1.05; first summarized from the 3rd Edition, Sep. 2023, R1.03)
version: R1.05 (first written for R1.03)
status: processes, scripts, adtsys.sup, classifiers, ADT group, AUDIT_TRAIL contents, selection groups and ADTLOG (default and filtered) verified on the R1.03 test system 2026-10-01; on the R1.05 test server processes, ADT group, classifier list, dataset definitions, setup files, start scripts and an RQL read of AUDIT_TRAIL verified 2026-10-09 (read-only); distributor, extra collectors, classifier extension in C from docs
---
# Audit Trail Management Engineering (R1.05)
**R1.05 re-check (2026-10-09).** The 4th edition (Feb. 2026) differs from the 3rd only in the
revision table and contact information (full text diff, `tools/manual_diff.py`); section
numbers are unchanged. The installed software changed without manual text:
- `AUDIT_TRAIL` fields `APPROVAL_REASON` (256) and `APPROVER` (128), added for FDA Part 11
(approval of changes to critical process parameters); `E_LAYOUT` units `APPRR` / `APPR`
(ISS-140). Filled by display writes with a reason and approver (IM 36K10C50 §2.22, §4.12;
ISS-099).
- 499 classifiers (R1.03: 463): action `PENDING`, sources `REST-SERVER`, `PYTOOLS`,
`PASSWORD-CHECK` (ISS-141).
- `audit_start.cmd` / `audit_stop.cmd` call `?*_audit_start.cmd` / `?*_audit_stop.cmd` (ISS-142).
- Unchanged: executables, `AUDIT_EVENT_CLAS_DF` and `AUDIT_SELGRP_DF` definitions, `fmfprt.sup`,
the rest of `adtsys.sup`; `adtini.sup` differs only in licence lines. `dur.sup` gives
`ADTSTO` an adaptive queue (ISS-109, ISS-122).
Details are in the sections below, marked "R1.05".
AUDIT Service records who changed what and when: value and limit changes, definition inserts /
modifies / deletes, alarm acknowledgements, logins and logouts. Events are stored in the history
storage group `ADT` and read through dataset `AUDIT_TRAIL`. The manual is written for system
integrators (processes, setup file, extending the classifier tables in C). Section numbers refer
to the manual; "installed" means checked on the R1.03.00 test system.
## 1. Interfaces and data stores (§1)
| Interface / store | Use |
|---|---|
| Notification | Applications report an event (routine `adt_evt_not`); only one field of a stored event, the *modifiable ASCII application info*, can be changed afterwards |
| Distribution | Connected processes (AUDIT destinations) receive events as they are stored, optionally filtered by a selection group |
| Retrieval | Reading stored events (collector process; `AUDIT_TRAIL` dataset) |
| History management | Storage group `ADT` is managed by HISTORY Service (rollover, lifetime, units) |
| Event classifier file | Which event types exist and whether each is **stored** — dataset `AUDIT_EVENT_CLAS_DF` (`tls\dat\adt_ecl.dat`) |
| Selection group file | Named, compiled selection expressions — dataset `AUDIT_SELGRP_DF` (`tls\dat\adt_sgp.dat`) |
Single events cannot be deleted; only whole storage units or the whole group (HISTORY Service).
## 2. Processes (§1.2, §2, §4.1)
| Process | Job |
|---|---|
| `ADTSTO` (storage) | Creates group `ADT` if missing (rollover 1 day, unit lifetime 2 days), fills the classifier file with the basic set (existing entries kept), creates the selection group file, stores events, sends them to destinations. Ignores events while storage of `ADT` is stopped. Must run on the node of the history manager `HIS` |
| `ADTCOL01` (+ `ADTCOL02`…) | Answers retrieval requests, also while storage is stopped; extra images share the queue `adtcol01` (load sharing). Exits if group `ADT` does not exist, so `ADTSTO` must start first |
| `ADTDST` (distributor) | Optional relay on another node when several destinations there want events (3 + N instead of 3 × N BUS messages) |
| `ADTLOG` (logging) | Optional destination that prints events as text (stdout or `PRT_DEV`), optionally only a selection group |
Gaps are signalled with *missing events* records/messages (storage queue overflow, lost
connection, unexpected sequence number). Destinations check sequence numbers and periodic
flow-control messages; a missing flow-control message makes them reconnect.
**Installed:** `tls\com\audit_start.cmd` does nothing if `adtsto` already runs, refuses to start
when `his` is not running, then starts `adtsto -n adtsto` and `adtcol -n adtcol01`. `adtcol02`,
`adtlog` and `adtdst` are present as commented-out lines. `audit_stop.cmd` stops `adt*` with
`durstp`. Executables in `tls\exe`: `adtsto`, `adtcol`, `adtdst`, `adtlog`, `adtimport`
(undocumented), `adtxdb` (service debugger, not documented).
**R1.05 (verified 2026-10-09):** same executables and the same two processes running
(`ADTSTO`, `ADTCOL01`). At the end `audit_start.cmd` calls every
`tls\com\?*_audit_start.cmd`; `audit_stop.cmd` calls every `?*_audit_stop.cmd` before stopping
`adt*` (ISS-142).
## 3. Event classifiers (§3.1, Appendix 1)
An event classifier is four names `<SUBJECT>.<ATTRIBUTE>.<ACTION>.<SOURCE>`, e.g.
`ITEM.VALUE.MODIFY.HMI`. Each name has an internal code; stored events keep only the codes, so
codes must never change once used.
- **Subjects**: ALN-DEST, ALN-USR, CLASS, CLASS-ATTR, DATASET, EQUIPMENT, F/T-SYSTEM,
INSTALLATION, ITEM, OBJECT, OBJECT-ATTR, SECTION, STATION, SUB-ITEM, TRIGGER-GROUP, UNIT,
USER-PROFILE, ACKNOWLEDGE-TYP.
- **Attributes** (about 170): item properties (VALUE, STATUS, HIGH-LIMIT, LOW-LIMIT, DESCRIPTION,
ENGINERING-UNIT, ALARM-INHIBIT, ALARM-SHELVE, ENABLE-AUDIT-TR …), point/line properties,
alarm notification users and schedules, NULL-ATTR (no attribute).
- **Actions**: ACKNOWLEDGE, DELETE, INSERT, LOGIN, LOGIN-ATTEMPT, LOGOUT, MODIFY, SHELVE,
UN-SHELVE (the manual's explanations of SHELVE and UN-SHELVE are swapped).
- **Sources**: COMPUTE (PROCESS Service), DSS-CLIENT, ENT-EDIT-MOD, ENT-ENG-MOD, ENT-QUALIZATION,
FTEXCHANGE, HMI (Engineering Module), LOC-EDIT-MOD, LOC-ENG-MOD, ODBC, OPC-DA-SERVER,
OPER-INTERFACE, OTHERS, QUICKLOAD.
The notifying routine checks a cached copy of the classifier's **storage** flag and sends
nothing when storage is off; the cache refreshes every `ECL_REFRESH` seconds (default 1800), so
a change to the storage flag may take up to 30 minutes to reach running programs.
**Installed:** `AUDIT_EVENT_CLAS_DF` fields `NAME` (the four names joined), `SUBJECT`,
`ATTRIBUTE`, `AGITATION` (= action), `SOURCE`, `DESCRIPTION`, `BASIC_SET`, `STORAGE` (the only
changeable field); 463 classifiers, 444 stored. Off by default: the `COMPUTE` (PROCESS) source for
item/sub-item values, status, quality, limits, deadband, and `DATASET.NULL-ATTR.*.COMPUTE`. Not in
the manual: subject `CI-SERVER` (logins; the manual's `F/T-SYSTEM` is the old name), subject/action
`EAL OPERATION`, source `VIA-OPC-UAS` (ISS-051).
**R1.05 (verified 2026-10-09):** 499 classifiers, all basic set, 478 stored. New (36, not in the
manual, ISS-141): action `PENDING` on `ITEM.VALUE` / `ITEM.STATUS` for sources `HMI`,
`LOC-ENG-MOD`, `OPER-INTERFACE`, `OTHERS`, `VIA-OPC-UAS`, `COMPUTE` (the `COMPUTE` pair off), tied
in the C header history to Vnet *on send* / *on receive* item update policies; sources
`REST-SERVER` (RESTful API), `PYTOOLS` (IM 36K10P40) and `PASSWORD-CHECK` (Edit Module Password
Check, IM 36K10C50 §2.31) for `CI-SERVER` login / logout / login attempt and `DATASET`
insert / modify / delete, plus `ITEM.VALUE` / `STATUS` / `QUALITY-CODE` `MODIFY` for the first
two. Defined in `tls\inc\adt_ece.h` (`ADT_SAC_PEND`, `ADT_SAS_JRST`, `ADT_SAS_PTLS`,
`ADT_SAS_PSWD`). Off by default: the 19 `COMPUTE` classifiers of R1.03 plus the two
`PENDING.COMPUTE`.
**What is actually recorded (verified):** configuration changes and DSS value writes are stored
as *dataset* events — `SUBJECT_GROUP` = dataset name (`ITEM_DF`, `ITEM_VAL`, `SECTION_DF` …),
`SUBJECT_ATTRIBUTE` = field, old and new value, user and source: `ENT-ENG-MOD` for `dssqld`
(not `QUICKLOAD`), `LOC-ENG-MOD` for the Engineering Module; every `dssqld` run also adds a
`CI-SERVER` `LOGIN`/`LOGOUT` pair. `itmval -p` writes are not audited. The item option
`AUDIT_INFO` (*Audit trailing wanted*, default 0; also on `SUB_ITEM_DF`, `EXTERNAL_ALARM_DF`) made
no difference for these tools; it switches the `ITEM.*` events of **operator writes**: a button on
display `CIENG_Tank` stored `ITEM.VALUE.MODIFY.OPER-INTERFACE` (old/new, user) with
`AUDIT_INFO` 1 and nothing with 0 (verified, ISS-049; the same events from *Manual* / *Auto* on
`CIENG_Control`, 2026-10-06). A changed `STORAGE` flag takes effect only after the notifying process
re-reads it (`ECL_REFRESH`, up to 30 minutes, both directions; verified, ISS-050).
## 4. Setup files (§4.2)
Only `tls\sup\adtsys.sup` is installed; it documents every keyword and is the template for
per-process files named after the process (`adtsto.sup`, `adtcol01.sup`, `adtdst.sup`,
`adtlog.sup`, `adtovv.sup` for the chronological overview). Without a file, defaults apply.
| Tab / keyword | Meaning | Default |
|---|---|---|
| General `MAX_OPEN_UNITS` | Storage units open at once (2–100) | 20 |
| `PRT_DEV` | Printer for `ADTLOG` | stdout |
| `QUESIZE` | BUS queue size, kB | see below |
| `SEL_GROUP` | Selection group applied by the process | none |
| Node Numbers `COL_PROC`, `DST_PROC`, `HIS_PROC`, `STO_PROC` | `<node>, <name>` of collector, distributor, history manager, storage | local `ADTCOL01`, local `ADTSTO`, local `HIS`, `ADTSTO` on the host node |
| `NODE_ECL_FILE`, `NODE_SGP_FILE` | Node holding the classifier / selection group file | storage node |
| Layout `E_LAYOUT` | Message units and widths for the overview / log (`ACTM` time, `SBGP` subject, `SATR`, `SACT`, `SACS`, `SBID` subject id, `USER`, `TERM`, `OVAL`/`NVAL` old/new value, `REAS`, `AAI1`/`MAI1` application info, `ACND`/`ACNM`/`NOND`/`NONM`/`NOTM` node, program and notification time, `SPCE n`, `NWLN n`) | `SPCE,2,ACTM,21,SBGP,13,SATR,13,SACT,11,SACS,15,NWLN,1,SPCE,4,SBID,40,USER,16,NWLN,1,SPCE,6,OVAL,35,NVAL,35,NWLN,1` |
| `E_NOSPACE` | No automatic space between units | off |
| `TIMEFMT` | Picture for `ACTM` (`YYYY MMM DD hh mm ss ppp`) | see below |
| Events `ECL_REFRESH` | Classifier cache refresh, s | 1800 |
| `FLOWC` | Flow-control interval, timeout (s) | 30, 10 |
| `HBEAT` | Heartbeat, s | 10 |
| `TRYCON` | Reconnect interval, s | 10 |
| Header `FORM_FEED`, `HEADER` (repeatable), `HEADER_AFTER` | Log header | off / layout header / never repeated |
**Installed differences:** the `adtsys.sup` help says `QUESIZE` default 10 kB (minimum 10), the
manual says default and maximum 200 kB; the file sets `QUESIZE = 200`. The `TIMEFMT` default is
`DD/MM/YY hh:mm:ss` in the file help and `DD/MM/YY hh:mm:ss.ppp` in the manual; `ADTLOG` prints
milliseconds, so the manual is right (ISS-051). Also installed: `adtini.sup` (licence value only),
and `fmfprt.sup` assigns the printer function `AUDIT_TRAIL` to `ADTLOG`.
**R1.05 (verified 2026-10-09):** `adtsys.sup` and `adtsys.tpl` add only the `E_LAYOUT` units
`APPRR` (approval reason) and `APPR` (approver) (ISS-140); the `QUESIZE` and `TIMEFMT` help texts
are unchanged (ISS-051 still applies). `ADTLOG` with the new units not tested.
**Verified:** `adtlog -n <name>` run from a console prints new events with the default layout;
with a setup file `<name>.sup` holding `SEL_GROUP`, `E_LAYOUT`, `TIMEFMT`, `HEADER`,
`HEADER_AFTER` it printed only the selected events in the custom layout (sample
`examples/CI-Eng-Sample/audit/adtlogci.sup`).
## 4a. Selection groups (not described in the manual)
`AUDIT_SELGRP_DF`: `NAME`, `DESCRIPTION`, `EXPRESSION` (memo), `COMPILE`, `LISTING`,
`VALID_EXPRESSION`. The compiler listing names the language: string comparisons on `aai1 acnd
acnm actm mai1 nond nonm reas sacs sact satr sbgp sbid term user`, constant comparisons on `nval
oval`, operators `= != > < >= <=`, `and`, `or`, parentheses; no `LIKE` (prefix match with a range
`>= "X." and < "X/"`). Errors: `ADTT-E-UNKNOWN_TOK`, `ADTT-E-CMP_NO_SUCC`. Verified.
## 4b. Reading the trail
`AUDIT_TRAIL` (key `NAME` = `<action time>/<stamp>`; all fields read-only except `PROFILE` and
`APPLICATION_SUB`) is in `dssqld.sup` `NO-EXPORT`: export with `-d AUDIT_TRAIL` or a qli that
names it — the qli export returns 0 records unless `NAME` is in `@FIELDS`; `@SELECT` accepts
`LIKE "X.*"`. RQL `select … from audit_trail` works in reports (sample `CIENG_AUDIT`). `ADT`
group on the test system: lifetime 52 weeks, rollover 1 day. Task files: skill `audit-trail`.
**R1.05 (verified 2026-10-09):** `audit_trail.dss` adds `APPROVAL_REASON` (char 256) and
`APPROVER` (char 128), select only (ISS-140). An RQL read on the R1.05 test server found them
filled on operator item-value writes (`OPER-INTERFACE`), with `REASON` empty. `ADT` group there:
52 weeks, 1 day. `dssqld.sup` still has `NO-EXPORT=AUDIT_TRAIL`.
## 5. Extending classifiers (§4.3)
New subjects/attributes/actions/sources are added in C: `#define` codes ≥ `0x80000000` in
`adt_ece.h`, names starting with `_`, rebuild `adt_ece()` (`tls\src\adt_ece.c`) and re-link AUDIT,
INTEGRATION, DATABASE Service and every program that uses it. **Installed:** `adt_ece.c`,
`tls\inc\adt_ece.h`, `audit_compile.cmd`/`.mak`, `audit_build.cmd`/`.mak` are shipped. System
integrator work; not practiced.