Changelog¶
Repository changelog rendered inside the searchable docs site.
For upgrade planning, read Version History,
then open the affected Install, Program, Run, Hardware, or Reference
page.
Repository Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
[Unreleased]¶
- Specify runtime clock dispatch name/error identity and deterministic LSP diagnostic-override collision precedence, including canonical-key priority and alias-only lexical ordering.
- The parser example-corpus test now fails when the checked-in example tree is missing and parses every checked-in example instead of silently skipping the suite.
- Specify the nine shipped tutorial files as executable compile contracts and lock the blinker, traffic-light, and motor-starter examples to their reviewed clean-cycle timing and I/O sequences.
- Specify the native browser-analysis and WebAssembly JSON adapter boundary for native-result parity, opaque virtual document identity, full-set replacement, and explicit JSON success and failure projections.
- Specify the runtime variable-storage contract for instance-field resolution, declared layouts, reference-helper equivalence, cache invalidation, copy-on-write nested updates, and checked extreme array bounds.
- Specify fail-closed host lvalue writes, bounded helper capabilities, host-stage POU defaults and write-through behavior, IEC array repetition, representative integer-base exponentiation and Boolean comparison results.
- Specify retain codec compatibility, filesystem transaction visibility, retry semantics, atomic migration, and typed migration/orphan events.
- Specify mesh envelope metadata, subscription grammar, typed numeric decoding, bounded malformed-input handling, readiness, liveliness, QoS, and snapshot failure contracts without overstating TLS or query/reply proof.
- Specify the ADS AMS/TCP prefix, frame-length cap, header/payload correlation, canonical serialization, and response endpoint/correlation contract.
- Specify per-cycle watchdog deadline arming/restoration and bounded automatic restart backoff without treating host-runtime policy as an IEC deviation.
- Align runtime scheduling documentation on priority, due-time, stable-index, registered-high SINGLE, and background-program execution order.
- Specify ADS notification cadence, on-change coalescing, watch-length source sampling, invalidation, and representable FILETIME conversion.
- Specify ADS service-port routing, router/system compatibility responses, notification receiver binding, and bind-conflict startup failure.
- Specify deterministic ADS server symbol assignment, duplicate rejection, flag preservation, serialization identity, and local version progression.
- Specify deterministic simulation-model activation, coupling and physics scan boundaries, conflict rejection, replay, scripted faults, and scaled-clock watchdog isolation.
- Specify the
trust-st-complete-v1PLCopen profile, ST/data-type interchange, fail-closed import diagnostics, migration and CODESYS metadata, reviewed vendor shims, and Allen-Bradley/Siemens adapter artifact contracts.
Target release: v0.24.69
Added¶
- Persist canonical OpenOT event, loss, and placeholder documents outside the PLC scan to a TOML-selected SQLite, PostgreSQL, TimescaleDB, MySQL/MariaDB, SQL Server, or InfluxDB 3 backend, with atomic durable checkpoints, idempotent replay, TLS/secret boundaries, InfluxDB outage spooling, runtime status, complete examples, and real-vendor conformance coverage.
- Expose typed logging objects with descriptive names such as
logged_values,alarm_history,message_log,state_history, andaudit_log; normal reports no longer require OpenOT field arrays or JSON paths, while canonical JSON remains internal recovery authority. Every backend and the InfluxDB spool initialize the same first schema generation, 1, directly. Because database persistence has not previously shipped, incompatible pre-release development schemas fail closed without migration, backfill, reconstruction, or automatic repair. Runtime status reports this shared contract asschema_generation, not a backend-specific version. - Support MQTT tag mappings that bind fully qualified scalar program variables
directly to broker topics with explicit PLC-relative
readandwritedirections.
Fixed¶
- Resolve symbolic MQTT tag mappings when a project is launched in the VS Code simulator, so mapped outputs connect and publish instead of leaving the debugger with an empty process image.
- Preserve typed database transport failures through OpenOT schema initialization, commit, and maintenance so bounded reconnect still applies, while deterministic projection and storage failures fault immediately instead of repeatedly reopening the selected backend.
- Freeze bounded OpenOT shutdown drains from a fresh non-consuming producer head so records published after an older buffered poll are still committed, and restrict real-database runner teardown to exact-labelled Docker resources even when a matching temporary-state marker exists.
- Keep OpenOT source-head and pending-byte status observable while an initial remote database connection is unavailable, and run the same complete Architecture Safety gate before push and in GitHub CI. Protect active shared-builder Cargo targets with stable external leases so concurrent cleanup cannot delete exact-candidate test executables without leaking those leases into helper daemons or detached children, and preserve target compiler discovery instead of injecting host C/C++ compilers into Windows cross-target checks.
- Keep SQL Server logged-value statements below its 2,100-parameter limit, constrain the MySQL/MariaDB schema marker to its single valid key, replace the yanked MySQL client patch release, and run the same supply-chain policy in exact pre-push validation and GitHub CI.
- Keep PLC startup independent of remote logging availability, preserve cumulative status across reconnects, drain bounded shutdown work, and report the actual opened backend schema without exposing secrets.
- Make InfluxDB delivery bounded and continuous under sustained input, retain the complete typed/domain/provenance model, and require authenticated, CA-verified real-product release proof.
- Publish an InfluxDB spool commit before surfacing later reconciliation failures, preserve detailed reconciliation counters through backend selection, and reject compiled-out TOML backends synchronously at startup.
- Reject missing or empty selected database environment variables before worker startup, retry only explicitly classified remote-open reachability failures, and fault permanent schema or storage-open errors immediately.
- Reject missing database CA files before starting the persistence worker, preserve complete loss/unresolved provenance in SQL Server combined commits, and require capture-lifecycle parity for every Docs Captures workflow path.
- Provision every real logging database from repository-owned, digest-pinned runner scripts with ephemeral credentials, authenticated readiness checks, symlink-safe container/network/anonymous-volume teardown, and retained exact-candidate evidence.
- Make every OpenOT database example portable to Windows and Linux by using a
TCP runtime control endpoint with an explicit local-only example token instead
of a Unix-only
/tmpsocket. - Preserve previous-value and audit fields in every relational
logged_valuesrow, reapply SQLite/Influx spool durability settings on every connection, and reject generation-1 databases whose actual columns, constraints, foreign keys, or indexes differ from the schema created by truST. -
Keep initial InfluxDB transport outages in the bounded reconnect lifecycle, reclaim exact-labelled real-database runner resources after interrupted jobs even when temporary state was lost, and make exact-candidate Clippy use the same warning-deny command as GitHub CI.
-
Keep real-Mosquitto conformance compatible with broker versions whose help command prints a usable version and then exits nonzero, so optional version reporting cannot override passing protocol assertions.
- Run exact-candidate VS Code browser and Extension Host checks with a unique,
short-lived
/tmpdirectory so long validated Cargo target paths cannot break Unix-domain process sockets. - Keep native Unix control-endpoint tests portable under long temporary paths, and make automated docs captures reap their owned process sessions and code-server container after success, failure, or interruption.
- Keep the Web IDE Hardware tab responsive for ordinary communication graphs by coalescing repeated hydration relayout requests into one bounded animation frame and one post-hydration resize/fit pass.
- Make post-merge release verification audit the exact candidate branch and validation worktrees, block dirty or divergent state, and report explicit cleanup targets before a release handoff can be completed.
- Report prunable candidate worktree registrations as cleanup targets instead of misclassifying their missing directories as dirty worktrees.
- Give capture lifecycle assertions enough time to observe the launcher's bounded TERM-to-KILL cleanup and process reaping path.
- Reconcile staged checksum paths with GitHub's flat release-asset namespace while rejecting ambiguous basenames and unsafe manifest paths.
- Keep exact-candidate remote validation aligned with CI by disabling inherited Rust compiler caches and serializing the cold all-tests build to bound disk use.
- Fail exact-candidate preparation before creating build artifacts unless the remote builder has at least 80 GiB free, reflecting the measured size of a cold uncached all-tests target.
- Keep workspace integration-test binary discovery compilable under cold all-target check and clippy runs, and enforce that portability contract in CI.
- Keep direction-specific MQTT mappings isolated: write-only drivers no longer
clear shared input bytes, and read-only mappings no longer publish the raw
output image to the default topic. An explicitly empty
mappingslist also disables both raw directions instead of restoring the default topics. - Give MQTT one authoritative communication specification instead of mixing broker and wire behavior into the runtime-engine contract, and make the changed-file verifier reject MQTT production changes without that owning specification and a native executable test.
- Preserve IEC enum identity across MQTT tag mappings while using declared numeric member values on the wire, including alias and direct-binding cases, reject undeclared inbound values atomically, and retain the declared enum name in control snapshots for resolved, error, and unresolved points.
- Let
trust-runtime ctl statusrender a healthy runtime's JSON-null fault asnone, matching the live control response contract. - Make reused runtime communications conformance output directories inspect only the current case invocation instead of accepting stale passing lines.
- Require the runtime communications conformance gate to execute the shipped MQTT traffic-light mapping against a real Mosquitto broker and client.
- Make the runtime communications conformance gate reject zero-test filters and align its development and WAN profile cases with the shipped policy.
-
Make the Neovim and Zed editor smoke gate fail when an exact Rust filter silently selects zero tests.
-
Make tutorial 09 a complete standalone simulation project so Compile and the Runtime Panel resolve its source and configuration instead of falling back to the repository root.
-
Bundle
trust-devin every release VSIX besidetrust-runtimeso native ST tests use the matching workbench binary and always return their JSON result. -
Reject unknown MQTT
io.paramsfields instead of silently falling back to default topics, and let write-only tag mappings run without requiring an inboundtrust/io/insnapshot. - ci/trust-runtime: The managed-fleet CLI lifecycle integration test now uses file-backed child output capture and bounded command execution, preventing a background Windows runtime from retaining a capture pipe and deadlocking output collection after the fleet command exits.
- trust-runtime: ADS import defaults and runtime test fixtures now preserve
portable TOML paths on Windows, normalize platform-native source-list paths
in build and check assertions, and keep absolute and escaping sidecar paths fail-closed;
CURRENT_DTboundary tests no longer depend on hostSystemTimerepresentations; deployment pointer replacement now removes its Windows directory-symlink backup correctly. - trust-plcopen: Exported source-map paths now use portable
/separators on Windows as well as Unix hosts, keeping project-relative artifact identities stable for automation consumers. - trust-runtime: HMI asset requests now reject uppercase
.SVGspellings consistently on case-insensitive filesystems, preserving the documented lowercase-only asset policy. - ci/trust-runtime: The OpenOT fenced cross-process capstone uses one configurable 120-second startup and completion budget, avoiding false failures on slower hosts without relaxing its delivery or loss assertions.
- ci/trust-runtime: The focused OSCAT aggregate-project harness now permits a five-minute child-test budget on slower hosts while retaining periodic progress reporting and the same pass/fail oracle.
- trust-dev: Generated API documentation now keeps source identities relative to the selected project on macOS and Windows as well as Linux, instead of leaking a platform-specific absolute temporary path.
- ci/docs: Browser capture navigation now retries a transient editor-server startup stall within the same rendered journey, preventing a healthy capture run from being reported as a flaky documentation failure.
- trust-dev: Agent workspace read/write responses now use portable
/-separated relative paths on every supported host, keeping JSON-RPC consumers and cross-platform automation stable. - trust-runtime: Hardware settings controls remain clickable and render the selected project's configured drivers before editor analysis is ready.
- trust-runtime: Hardware settings now keep the driver panel reachable in the scrollable settings surface, and control authentication tokens use masked password input instead of being displayed as plain text.
- ci/vscode: the exact-SHA release-candidate guard now runs Extension Host
tests under Xvfb, and rendered Live Values layout proof discovers installed
Chromium and Google Chrome executables without a builder-specific override.
Exact-candidate checks use a fast report-boundary smoke, disable incremental
build duplication, and safely reclaim only the configured generated target
between Clippy and
test-all; exhaustive verification-tooling fixtures remain scheduled/manual maintenance. - Reject ADS client connections that declare no points and make the communication authoring schema explain that activation requires at least one connection with a selected point.
- verification: case-table hashing now canonicalizes Windows CRLF checkout line endings, keeping committed case-file digests stable across runners.
- ci/trust-runtime: the live Modbus+MQTT composition test now retries the transient MQTT snapshot-startup race on non-Linux runners instead of treating the expected freshness delay as a product failure.
- ci/docs: Browser IDE capture automation now requests the editor session
required to switch the active tutorial project, and code-server captures now
assert the accepted
truST:command category, keeping post-merge docs captures aligned with the shipped authorization and command contracts. - vscode/trust-runtime: Windows ADS discovery now uses the installed TwinCAT router for same-computer port and symbol operations, and Devices & Connections no longer offers an unverified ADS identity as an actionable fallback device.
- vscode: Devices & Connections now renders cached project state before runtime enrichment and schedules polling only after each refresh completes, preventing slow Windows requests from starving the canvas; simulator Start now waits for the real Structured Text debug session and bounds I/O probes so a successful launch is not reported as a timeout.
- ci: the main-branch version release guard now allows 90 minutes for a matching Release workflow to finish, with a larger job budget and a focused regression test, so healthy cold Windows artifact builds do not fail release evidence at the former 30-minute boundary.
- vscode: fixed stale Devices & Connections refresh and discovery sessions so editor-group resize/remounts cannot publish torn capability state or leave old Discover cards actionable; hidden webviews now pause polling and resynchronize when visible.
- vscode: kept Browse-tags symbol selection on accessible native checkbox semantics and added a real X11 quick-click/Space regression journey across multiple Network Canvas refreshes.
- vscode: changed the fail-closed writable ADS import refusal to a complete modal explanation with a Start runtime recovery action.
- docs: Communication overview pages now list Beckhoff ADS alongside Modbus, MQTT, and OPC UA so the public navigation path matches the shipped ADS client/server support.
- Write the correlated runtime control acknowledgement before applying an accepted shutdown stop signal, preventing managed fleet stop from losing its response while the runtime process exits under load.
- Update the VS Code dependency lock to patched
brace-expansionandjs-yamlreleases after their high-severity denial-of-service advisories. - Keep malformed numeric candidates such as a real literal with a trailing dot as one fail-closed lexer error instead of publishing a valid numeric prefix.
- Preserve the stable
E106invalid-identifier diagnostic when malformed identifier candidates are rejected directly by the lexer, instead of degrading the editor diagnostic to a generic parser error. - Keep function-block parameter defaults in instance storage while encoding
recursive function/method call-local
INandOUTdefaults, including fixed and wildcard arrays, structs, unions, nested strings, and NULL references. Constant validation now shares one bounded recursion policy and rejects malformed aggregate frames and non-NULL reference identities, while supplied interface and object-instance formals no longer fail bytecode publication merely because no portable implicit constant exists. - Publish uniquely resolved cross-file enum values into their enclosing scope so later program initializers can use them, while preserving ambiguity for colliding variants from distinct enum types.
- Preserve enum identity for unqualified
CASElabels in bytecode lowering so both VM execution paths select the matching branch without weakening same-named constant shadowing. - Keep same-named fleet runtimes, endpoints, configured mesh peers, and links distinct across hosts and containers when Devices & Connections displays or combines legacy schema-v2/v3/v4 snapshots, including singleton topology, while failing closed only for ambiguous references and preserving unrelated topology.
- Clamp LSP telemetry duration milliseconds at
u64::MAXinstead of wrapping an overflowing duration into a small, misleading latency value. - Document the external-diagnostic JSON input contract, including trimmed, case-insensitive string severities and numeric LSP severities.
- Reject mutable BOOL, REAL, STRING, and aggregate-member dependencies in explicit variable initializers instead of applying the constant-expression rule only to direct integer initializers.
- Preserve the IEC reference-declaration exception so
REF_TOvariables may initialize fromREF(...)of eligible existing storage while retaining the canonical REF lvalue, type, visibility, and lifetime diagnostics. - Publish stable
C001-C005LSP configuration diagnostics for unreadable or malformed files, unknown standard-library profiles and workspace visibility, invalid positive bounds, and ignored invalid severity overrides; E303/E304 explainers now link to their actual IEC array/range clauses. - Keep project source discovery inside the supported
.st/.pouset after resolving contained symbolic links, while retaining deterministic canonical identity for valid contained aliases. - Preserve runtime link health detail in Devices & Connections and render degraded/error links with distinct warning/error tones plus an accessible hover/focus explanation.
- Release tag and version-evidence guards now fail closed unless an annotated tag resolves to the exact release commit, CI and Release runs match the exact event, branch, and SHA with usable URLs, API collections are well formed, successful API responses are top-level objects with stable endpoint/status diagnostics instead of tracebacks, and published asset names are unique.
- HIR temporal arithmetic now implements the complete documented IEC 61131-3 Table 35 operand/result matrix and rejects swapped, cross-family, and other unlisted temporal combinations at the operator boundary.
- Invalid user-defined type formations now remain internal diagnostic-recovery records instead of becoming publicly discoverable types, while valid sibling declarations continue to publish normally.
CURRENT_DT()now has an explicit UTC host-clock contract and preserves the full millisecondDTtick range instead of overflowing when the intermediate Unix timestamp exceeds signed nanoseconds.- OpenOT runtime conformance tests now carry the complete pinned authoring and
value-sampling Structured Text fixture closure, so those tests execute
independently of a sibling
open-ot-refcheckout instead of failing at the frozen-fixture boundary. trust-dev testnow compiles projects that contain no test POU before reporting an empty run, so compile-negative fixtures cannot become false successes merely by using ordinaryPROGRAMdeclarations.- HIR and runtime timer registration now support the IEC 61131-3 Table 46
TP_TIME,TON_TIME, andTOF_TIMEnames with fixed TIMEPT/ETsignatures and the same scan-step behavior as their overloaded base forms. - Bytecode
FORloops now derive their internal zero sentinel from the evaluated step value, so valid unsigned control variables and steps no longer fail strict numeric comparison with an unrelatedLINTsentinel. trust-runtime playnow creates a project only for ordinary project absence; current-directory and system-I/O configuration failures remain visible instead of being treated as a first-run setup request.- ADS onboarding sum-up reads now reject unknown handles and incomplete, duplicate, unknown, non-good, valueless, or descriptor-incompatible results before projecting any wire value.
- HIR now rejects an explicit integer variable initializer that depends on an ordinary mutable variable, while preserving literal and declared-constant integer expressions required by IEC 61131-3 Section 6.5.1.3.
- File-backed retain snapshots now persist
PROGRAMVAR RETAINvalues under collision-free qualified identities, restore the saved value on warm restart, and remain unloaded on cold restart; the reliability test now distinguishes a real store reload from unchanged live memory. - Debug breakpoints now emit at most one stop per breakpoint identity within a runtime scan, preventing overlapping debug-map entries from repeatedly stopping the same scan while preserving breakpoint re-hits on later scans.
- Runtime bytecode documentation now matches the executable STBC 1.1 opcode set and specifies source-to-section, resource/process-image, variable metadata, and validation contracts used by the existing encoder and runtime.
- trust-debug now rejects
stackTracerequests for thread IDs that are absent from the current DAP thread projection instead of returning a synthetic frame for another thread; debug evaluation documentation now matches the shipped side-effect-free standard-function whitelist. - trust-runtime-core and trust-hir now reject explicitly typed mixed numeric
operations when the operands have no accuracy-preserving common type instead
of silently widening values such as
ULINTtoREAL; representable untyped numeric literals retain their valid contextual operand or overloaded-argument type. - OSCAT: decimal rounding, random helpers, array shuffle, random generators,
and dew-point relative-humidity conversion now preserve their declared
INT/REALtypes instead of failing at runtime when genericLIMITexpressions widened untyped bounds;IS_SORTEDnow reports unsorted nonempty arrays instead of overwriting its detected failure. OSCAT bit-transfer documentation and tests now also honor truST's existing rejection of non-finiteREALvalues. - VS Code: managed runtimes whose status command fails or returns an unrecognized state are now shown as unavailable with lifecycle actions disabled instead of being misreported as stopped and offered a misleading Start action.
- trust-syntax:
ACTION ... END_ACTIONdeclarations nested in aPROGRAMare now parsed as action nodes instead of terminating the program statement list early and cascading top-level parse diagnostics. - PLCopen Motion:
MC_Stopno longer reportsBusyandDonesimultaneously after reaching zero velocity, and public parameter writes to standard read-only Part 1 values are now limited to the documented disabled, idle initialization phase; the vendor BOOL extension is published asPN_TRUST_VendorBool0. Buffered commands flushed byErrorStopnow reportErrorwith the retained axis fault code instead ofCommandAborted, even whenMC_Resetruns before the buffered FB observes the flush. - trust-runtime: removing the final project I/O driver now retains
io.tomlwith an explicit no-driver posture, preserving safe-state policy and project comments outside rewritten driver/safe-state items without implicitly activating machine-wide system I/O fallback. - trust-runtime-core: indexed string replacement now applies the destination
CHAR/WCHARwidth to one-scalarSTRINGandWSTRINGvalues instead of bypassing overflow validation. - trust-hir: unambiguous integer-valued enumerated constants are accepted as array bounds, while nonconstant integer indexes are no longer rejected solely because their declared subrange extends beyond those bounds; their actual computed value remains bounds-checked at runtime.
- VS Code: Devices & Connections now keeps established degraded and failed links solid while using semantic health styling, and renders configured-only links dashed so line style consistently represents topology proof.
- trust-runtime: registry publish help now describes standard bundle detection instead of claiming a current-directory fallback.
- trust-runtime:
hmi init,hmi update, andhmi resetnow preserve standard bundle-detection failures instead of silently treating an undetectable current directory as the selected project. - trust-runtime: versioned deployment now rejects invalid pointer slots before installation, copies enabled ADS and OPC UA client sidecars into the installed bundle, and rejects symbolic links in the copied bundle closure.
- trust-runtime: standalone
ide servenow rejects a non-directory project path before constructing control state or attempting to bind the web server. - trust-runtime: generated runtime templates and shipped examples no longer serialize an empty mesh authentication token that current configuration validation rejects; OSCAT runtime examples also include the required log, retain, watchdog, and fault sections, restoring loadable example projects and offline communication topology.
- trust-runtime: Modbus worker input and output deadline results now preserve
the configured
fault,warn, orignorepolicy; faulted stale input no longer copies a cached snapshot, and timed-out output remains queued. - trust-runtime: direct-address parsing now rejects sized, suffixed, spaced,
and otherwise malformed IEC wildcard forms, plus signed or non-decimal
address components such as
%IW+1, instead of accepting partial or ambiguous locations. - trust-runtime: Modbus
f32point scaling now rejects finite internalf64results that would narrow to infinity in the process image or wire payload. - trust-runtime: MQTT raw reads now select the newest payload drained for a scan, while the default fault policy preserves stale-input, output-deadline, and typed-output preflight failures instead of degrading them to success.
- trust-runtime: OPC UA client configuration now rejects duplicate connection names, empty endpoint authorities, anonymous credential fields, and conflicting access aliases; client PKI operations ignore or reject symbolic links detected at roots, entries, and promotion targets, and one-shot read/write paths now invoke an exact service-result cardinality guard.
- trust-runtime: OPC UA client workers now reject mismatched and stale-session subscription events, preserve newer queued output generations across older completions, reject non-finite scalar outputs before transport, and wake promptly while revoking readable authority during shutdown.
- trust-runtime: ADS server publication now selects bounded symbol sets in canonical-name order, client policy compares parsed exact IP identities and requires explicit opt-in for unpinned entries, and security-first write rejection preserves precise ADS errors without queueing PLC mutations.
- trust-runtime: ADS client workers now reject malformed or miscorrelated handle, poll, subscription, and notification responses before publishing authority; rebuild symbol-derived state only from stable token-bracketed candidates; preserve newer generation-tagged output intent across older completions and error projection; terminally retire only the correlated rejected generation; reject non-finite output values before the shared queue; and revoke cached input authority during prompt shutdown.
- trust-runtime: active ADS device lookup now requires an IP-literal route's host, AMS port, and supplied target AMS identity to identify the same Doctor target instead of accepting a partial endpoint match.
- trust-runtime: the ADS server Doctor now derives health from the live server symbol table, rejects blank external proof and zero handles, requires complete notification samples, and rejects response-direction or endpoint identity mismatches before trusting loopback payloads.
- trust-runtime: ADS client configuration parsing now rejects duplicate connection names, noncanonical target AMS Net IDs, and blank or noncanonical explicit local AMS Net IDs before constructing activation routes.
- trust-runtime: ADS client configuration parsing now rejects zero or non-STRING capacities, overflowing array byte lengths, and index-address sizes that disagree with the declared scalar or array type.
- trust-runtime: ADS client connections now reject noncanonical target or local AMS Net IDs and target AMS port zero before invoking the connector or opening TCP, while preserving cached symbol-handle and subscription state when validation fails.
- trust-runtime: the ADS Doctor now rejects malformed manual endpoints before transport activity, rejects blank or absent explicit symbols at the upload boundary, refuses active-device snapshots for another ADS endpoint, and no longer reports empty, timestamp-less, or degraded live point sets as a passing batch read.
- trust-runtime: ADS diagnostics now fail closed for empty reports and non-blocking failed steps, reject incomplete or role-mismatched TwinCAT production evidence, and require the declared age, clock, deployed-config, and live-status evidence to remain current before reporting readiness.
- trust-runtime: live ADS onboarding discovery now retains distinct runtime endpoints that share one host IP, and guarded write probes attempt and verify restoration after probe-write or read-back failure while preserving any restore failure in the returned diagnostic.
- trust-runtime: Runtime Cloud preflight now rejects empty, blank, or duplicate
target lists instead of allowing an empty dispatch or repeating a target;
cross-site writes in
devandplantprofiles no longer incorrectly require a WAN allowlist, whilewanremains explicit-allow only. - trust-runtime: Runtime Cloud control and I/O proxy planners now reject blank
routing/correlation fields and incompatible I/O proxy API versions before
preflight, returning a
400 contract_violationinstead of manufacturing an invalid action request. - trust-runtime: Runtime Cloud configuration reconciliation now records only the immutable desired snapshot actually applied; a newer desired revision accepted during an in-flight success or failure remains pending instead of being falsely reported in sync or stranded.
- trust-runtime: Runtime Cloud forward-additive schema validation now rejects blank or duplicate field names, zero-sized or overflowing ranges, overlaps, and fields inserted before the prior layout end instead of reporting an ambiguous memory layout as compatible.
- trust-runtime: Runtime Cloud topology no longer reports invented latency or packet-loss values from discovery-only presence, and loopback discovery for one peer no longer classifies unrelated peer runtimes as same-host T0 candidates.
- trust-runtime: Runtime Cloud dual-host HA now detects split-brain candidates across the complete supplied HA group even when an action targets only one candidate, and rejects a duplicate request while its first dispatch remains in flight instead of starting the protected command twice.
- trust-runtime: ADS onboarding now rejects malformed runtime-host and target IP addresses and blank or malformed local AMS Net ID overrides before constructing route authority, and canonicalizes valid six-octet overrides.
- trust-runtime: ADS discovery now preserves distinct PLC runtime endpoints that share one host IP while still deduplicating repeated observations of the same AMS Net ID and AMS port.
- trust-runtime: ADS route planning now encodes generated XML as data before embedding it in PowerShell, preventing route-name here-string breakout, and rejects blank one-shot credentials before calling the route wire.
- trust-runtime: ADS server-control symbol import now confines its three outputs to distinct project-relative non-symlink paths, keeps snapshots in the canonical import cache, and permits follow-up regeneration only when the existing generated ST still matches the current ADS configuration and cached snapshots. Acknowledged Write-only symbols now remain Write-only instead of acquiring a remote Read capability during import.
- trust-runtime: ADS symbol import no longer treats an empty include pattern as
a wildcard, correctly backtracks
*matches to anchored suffixes, and uses the canonical ST lexer to prevent keywords from becoming generated variables. - trust-ads-server: malformed sum-up write and read/write frames are now fully validated before any runtime write is queued, and notification-handle wrap finds a free non-zero handle instead of replacing a live registration.
- benchmarks: mesh query/reply and runtime-cloud dispatch now exercise the
exact
--payload-bytesrequested instead of silently capping at 256 bytes; T0, mesh, and dispatch reports expose the effective payload length. - ADS CLI:
ads server ... --jsonnow rejects control responses withok = falseor a missing Booleanokinstead of printing them and exiting successfully; JSON and human output now share the control-envelope check. - trust-harness: an explicitly empty authoritative
sourceslist now reportsinvalid_argument; failed load/reload attempts preserve the live session, and focused protocol tests lock source precedence, time-alias precedence, zero-cyclerun_until, and stable structural/runtime/boundary error kinds. - docs: the IEC deviations log now contains only concrete normative conflicts
or omissions. IEC-silent runtime/tool/vendor behavior remains in product
specifications, IEC-permitted non-finite
REALchoices are recorded in the decisions log, and the PLCopen LD interchange subset is routed to the PLCopen deviations log. - trust-runtime: rejected online changes and restarts now preserve the live variable/instance image, scan counter, fault state, telemetry scan state, and queued debugger mutations when retained-value migration or restart instance construction fails; warm-restart storage and retained values are staged before the bytecode commit.
- trust-runtime: newly encoded bytecode now preserves the declared IEC resource identity, and named bytecode application rejects an unknown resource instead of silently falling back to a different primary resource while retaining the single-resource legacy-placeholder compatibility path and normalizing it to the requested active resource identity.
- trust-runtime: guided project setup now rebuilds runtime configuration,
generated ST configuration, and bytecode coherently; wizard source discovery
treats paths literally and includes project dependencies; generated resource
names are valid non-reserved ST identifiers; dangling project I/O links are
removed when system I/O is selected; and remote setup fails closed on secure
randomness or token-expiry overflow. Partial browser apply requests now share
the advertised safe defaults and cannot write system-wide I/O unless
write_system_iois explicitly true; interactive browser ports above 65535 are rejected instead of wrapping to another port; and CLI setup rejects browser-only access, bind, port, and token-TTL options instead of silently ignoring them, including explicitly supplied default values. - trust-runtime: runtime and I/O configuration now reject millisecond values that cannot fit the signed-nanosecond duration, typed safe-state integers outside their addressed BYTE/WORD/DWORD width, mixed legacy and multi-driver I/O forms, and blank explicit paths, credentials, scalar selectors, or collection/map entries instead of panicking, wrapping, silently ignoring fields, substituting defaults, or downgrading authentication/source pins.
- trust-runtime:
playnow validates restart and simulation-scale options before auto-creating a selected project; runtime configuration rejects unknown log levels instead of silently treating them asinfo; legacy runtime-root source discovery treats paths literally and recursively; and validation/startup summaries no longer present disabled I/O drivers as active. - trust-runtime: registry publish without
--projectnow preserves standard bundle-detection failure instead of silently substituting a non-project current directory and reporting a later invented-bundle error. - trust-runtime: managed-runtime status no longer reports
stoppedwhen local auth config is invalid or a connected endpoint rejects/mangles the response; lifecycle control now checks response IDs and bounds response lines, read-only status/log calls do not create state, log tailing is memory-bounded by the requested line count, and early child/PID persistence failures are cleaned up. - trust-runtime: HMI scaffolding now discovers compiler project sources and
local dependency sources recursively with literal filesystem paths, so glob
metacharacters in project names no longer produce a false empty project;
wizard Git setup now rejects malformed or dangling
.gitfile markers. - trust-runtime: managed-fleet manifests now reject unsafe, whitespace-padded, or duplicate runtime names, malformed control endpoints, zero ports, and cross-role TCP port collisions before lifecycle mutation; fleet control-token generation now fails closed when operating-system secure randomness is unavailable.
- trust-runtime: deprecated workbench-command aliases no longer let a directory
or non-executable sibling
trust-devshadow a usable PATH command, and Unix signal termination now retains the conventional128 + signalexit status. - trust-runtime: deploy labels can no longer escape the bundle store, automatic labels remain unique within the same second, relative deployment roots and dangling pointers are handled correctly, ordinary files are not overwritten as pointers, external pointers are rejected, and pruning preserves the actual immediate rollback bundle. Deployment summaries now identify the new bundle, detect every runtime and I/O configuration-file change, compare safe states structurally, traverse source paths without glob interpretation, and fail instead of silently discarding source-read errors.
- trust-runtime:
ctlnow keeps the selected project's control token when an explicit endpoint overrides only the endpoint, and exits non-zero for rejected, malformed, oversized, timed-out, or mismatched-ID control responses instead of reporting script success. - trust-runtime: the conformance runner now rejects malformed case IDs,
unknown category directories, case directories without manifests, source
paths that escape their case, and
compile_errorcases that compile successfully instead of silently omitting or blessing invalid corpus entries. - trust-runtime: standalone
ide servenow prioritizes an explicitly selected root runtime, reports malformed primary runtime configuration before binding the web server, and loads the selected workspace runtime's recursive, deterministic build-source set instead of looking only in<workspace>/src. - trust-runtime: benchmark jitter summaries now report zero observations when fewer than two latency samples exist instead of inventing a zero-valued jitter measurement.
- trust-runtime: mistyped top-level commands now receive the correct suggestion
when
--verboseprecedes the command, and the suggestion vocabulary includes the shippedcheckandagentcommand families. - trust-runtime: pending debug writes and active forces are now cleared at runtime fault, stop, and restart boundaries so stale debugger mutations cannot cross a lifecycle transition.
- trust-runtime: pre-commit watchdog and output-handoff faults now restore the last committed output image before applying a partial safe-state map, so unconfigured points cannot receive pending values from the failed scan.
- trust-runtime: explicit conversions to
REALorLREALnow return the stable overflow fault when narrowing, parsing, or IEC bit transfer would synthesize NaN or infinity inside PLC state. - trust-runtime: deterministic simulation-time advancement now saturates at the signed nanosecond bounds instead of panicking or wrapping on overflow.
-
trust-runtime: OPC UA server variables backed by periodic PLC snapshots now advertise read-only access and reject client writes instead of acknowledging values that the runtime never applies to PLC storage.
-
verification: the runtime communications fuzz gate now selects the live WAN allowlist smoke module instead of exiting successfully after running zero tests; bounded campaigns also reject any zero-test Cargo filter.
- trust-ads-server: restored the command-dispatch cargo-fuzz target after the
symbol snapshot interface moved to shared
Arcownership, so all registered ADS fuzz targets compile and execute under the bounded campaign. - trust-dev: project-scoped commits now abort before mutation when the Git index already contains an in-scope path, while repository-root commits reject any pre-staged path and dry runs leave both the worktree and index unchanged. Project paths must resolve canonically inside the repository, and the index is checked again after interactive prompts so concurrently staged in-scope paths are not absorbed.
- vscode: connector state and health projections now accept only the shared canonical wire vocabulary, so unknown backend values fail visibly instead of flowing into the Devices & Connections UI as an invented status.
- vscode: updated build and test dependencies and pinned patched transitive
versions so the committed extension lockfile passes
npm auditwith zero known advisories; CI and release packaging now enforce the same audit. - trust-lsp: closing an unsaved file-backed document now cancels in-flight
semantic work, restores durable disk contents, and evicts semantic-token and
pull-diagnostic caches; late results are generation-checked under the cache
lock so discarded buffer state cannot survive
didClose. - trust-lsp: invalid incremental edit lines now preserve the last valid buffer and show a full-resynchronization error, while range/on-type formatting uses the shared LF, CRLF, and bare-CR line model instead of an LF-only splitter.
- trust-runtime: MQTT discovery now reports authentication and authorization
CONNACK rejections as
likelyprotocol evidence instead of overclaiming an accepted, confirmed broker session; clean-session DISCONNECT behavior is preserved. - trust-runtime: control requests denied by the reviewed role matrix now return
the stable
insufficient_roleerror code before dispatch; reviewed operation names, fixed minimum roles, and debug-surface classification share one internal registry while unclassified operations remain Admin-only. - trust-runtime: bytecode decoding, validation, VM traps, and runtime failures
now expose stable lower-snake-case machine identifiers without parsing
diagnostic text; HMI type, bounded-string, subrange, and non-finite write
rejections return the matching identifier in
error_codebefore queueing. - trust-runtime: STBC decoding, validation, executable materialization, and VM execution now enforce the documented fixed container, instruction, reference, local, parameter, native-call, operand-stack, call-depth, and per-invocation instruction limits; stack, register, and tier-1 execution charge the same original bytecode instructions across nested calls.
- trust-hir/trust-runtime: implicit numeric assignment now permits only accuracy-preserving widenings, ordinary subrange initializers are checked at both bounds, contextual subrange literals retain their declared runtime tag, binary expressions, function returns, FOR bounds, and call arguments preserve their HIR-resolved or declared numeric type, and crafted primitive-tag mismatches fail before storage.
- trust-runtime: the embedded web server now isolates read-only traffic from a
fixed, bounded body/mutation lane, so incomplete request bodies cannot block
HMI and control reads; saturated lanes fail promptly with HTTP 503 and the
stable
server_busydenial code. - trust-runtime: TON, TOF, and TP elapsed-time accumulation now clamps safely
at
PTinstead of panicking in debug builds or wrapping negative in release builds near the signed TIME/LTIME duration boundary. - trust-runtime: STBC decoding now rejects duplicate standardized section IDs instead of silently selecting the first conflicting section during later validation and execution.
- trust-runtime: bytecode decoding now rejects top-level and nested collection counts that cannot fit within their section payload before reserving the declared collection capacity, preventing tiny malformed containers from requesting disproportionate allocations.
- trust-syntax: malformed
CASE,ELSIF,FOR,WHILE, andREPEATstatements now diagnose missing required delimiters instead of accepting partial syntax as a valid control-flow construct. - trust-lsp: cancelled workspace diagnostic requests now return
ContentModifiedinstead of a successful empty or partial report that could hide diagnostics collected after a newer semantic request superseded them. - trust-lsp: UTF-16 positions now recognize bare-CR lines and keep every CRLF terminator byte at the preceding line end, matching the LSP line-boundary contract for incoming requests and outgoing ranges.
- trust-runtime: debugger statement-boundary pauses no longer count operator dwell time against the active cycle watchdog or output-commit deadline; genuine execution time before and after resume remains bounded.
- trust-runtime: enabling the debug control surface now requires Admin instead of Engineer, and unclassified future control operations fail safe at Admin rather than inheriting Viewer authority.
- trust-runtime: online change now reads and validates the retained snapshot before replacing the live executable or resetting runtime state, preventing a retain-store failure from leaving a partially applied reload.
- trust-runtime: safe-state application now requires confirmed healthy driver
handoff, reports queued/reconnecting worker delivery as unconfirmed, attempts
every configured driver, and prevents a deliberate stop from reporting
Stoppedwhen physical safe-state delivery was not confirmed. - trust-runtime: retained snapshots are now fully validated before any restored global is changed, preventing a later incompatible value from leaving earlier values partially applied after a failed warm load.
- trust-runtime: MQTT typed input-point batches now commit their mapped process-image snapshot only after every payload validates, preventing values from a rejected non-finite batch from leaking into a later successful scan.
- trust-runtime-core: integer operand normalization now has an explicit
fail-closed contract: every integer runtime tag preserves its mathematical
value when representable as
i64, oversizedULINTvalues return overflow, and non-integer tags return a type mismatch. - trust-runtime-core: unsigned integer result materialization now preserves
every representable
USINT,UINT,UDINT, andULINTvalue exactly, rejects destination overflow, and rejects non-unsigned destination tags. - trust-runtime-core: retained snapshot insertion now has an explicit deterministic contract: new names append, reinserting the same resolved name replaces its value in place, and stored runtime values are preserved exactly until the owning persistence or reload boundary validates them.
- trust-runtime-core: task readiness now has an explicit deterministic contract for SINGLE edge sampling, periodic suppression, backward and forward logical-clock jumps, missed intervals, and saturating overrun accounting.
- trust-runtime-core: portable fault-state clearing now has an explicit lifecycle contract: it atomically removes the fault flag and stored error, preserves the configured fault policy, remains idempotent while healthy, and does not itself claim resource recovery or safe-state handling.
- trust-runtime-core: portable fault-policy decisions now have an explicit projection contract for halt, safe-halt, and restart, including the exact safe-state flag and the boundary between returning a decision and executing recovery actions.
- trust-runtime-core: fault recording and fault-policy replacement now have an explicit state-preservation contract, including latest-error replacement and changing policy while faulted without erasing the current fault.
- trust-runtime-core: watchdog policy installation now has an explicit normalization contract: enabled non-positive timeouts floor to one millisecond, valid and disabled timeouts retain their values, and installing policy does not itself execute a watchdog action.
Added¶
- vscode/trust-runtime: Devices & Connections can select any valid ADS server
port before browsing symbols, defaults to PLC port
851, preserves non-851 ports through browse/import/ads.toml, and distinguishes an unavailable ADS port, unsupported Symbol Upload, and an empty or incompatible symbol table. -
The VS Code extension test harness now supports opt-in
TRUST_VSCODE_TEST_GREPfiltering and optional per-test JSON output while preserving the unfilterednpm testdefault. -
verification: added direct cargo-fuzz targets for HIR lowering, PLCopen XML, bytecode containers, runtime configuration, LSP incremental edits, and HMI payloads; added direct runtime-anomaly tests; and resolved six obsolete test skips, including retirement of a capture for a runtime command that is intentionally hidden from the command palette.
- release: added digest-bound artifact provenance and result-derived conformance status assets, plus release checks binding the workspace version, tag, successful workflow, required assets, and GitHub Latest pointer.
- trust-runtime: documented the complete STBC validator-before-apply contract, added product-path malformed-bytecode case execution, and promoted the existing owner, reference, call, jump, stack, schema, checksum, and version rejection checks from quarantine into the regular test suite.
- trust-runtime: added focused automatic-restart storage tests alongside the existing runtime panic-containment and bounded Modbus slow-device tests.
- trust-runtime: added a Viewer-gated
connectors.statuscontrol surface that projects process-image I/O driver health and ADS client/server status into the shared connector status schema without changing the existingstatus.io_drivers,ads.status, orads.server.statusJSON contracts. - trust-runtime/vscode: Browser HMI and Devices & Connections now consume the shared connector status and discovery-confidence contract while presenting it with user-facing labels: HMI summarizes connections in one compact header chip, and Network Canvas/Discover use Connection, Health, Verification, and Signals wording instead of backend connector/proof terminology. Devices & Connections now rejects unknown state, health, or confidence values while retaining the affected peer topology and showing the validation error instead of silently dropping all peers.
- vscode: Generated truST projects and bundled examples now hide VS Code's native debug-status selector so the truST sidebar remains the single visible run/debug control surface while keeping the native simulator launch configuration available.
- vscode/trust-debug: Devices & Connections can add browsed ADS tags to a
stopped project through the same deterministic
ads import-symbolspipeline, and simulator/debug launches now load the project's ADS configuration so the generated_qualityglobals prove the live TwinCAT read path in Live Values. - trust-runtime: Modbus TCP I/O can now explicitly select FC01/FC02/FC03 input
reads and FC05/FC06/FC15/FC16 output writes through
input_functionandoutput_function, and can use optional per-point maps with bool/u16/i16/u32/ i32/f32 types, scaling, byte order, and word order while preserving the existing FC04 input-register and FC16 multiple-register default profile. - trust-runtime: MQTT I/O can now use optional typed per-point topic maps with
bool/u16/i16/u32/i32/f32 values, text/JSON/binary payload formats, and linear
scaling while preserving the existing raw
topic_in/topic_outbyte bridge. - trust-runtime: MQTT typed output points can opt into a bounded Sparkplug B
outbound node profile (
spBv1.0, Sparkplug 3.0.0) that publishes NBIRTH, configures NDEATH as the MQTT last will, and emits NDATA metric payloads with Tahu-compatible scalar protobuf encoding. - trust-runtime: added an ignored protocol device-in-the-loop gate for lab EtherCAT, ADS, Modbus, and MQTT targets, including explicit skip artifacts, hardware-required failure mode, nightly/manual workflow wiring, and JSON evidence for topology, discovery, doctor, and broker interop runs.
- trust-runtime: expanded the deterministic conformance suite to v2 with
strings, arrays, structs, enums, nested values, OOP dispatch,
REF_TO, retain/reset matrix, scheduler, and simulated connector-status determinism categories; CI now validates both summary schemas and uploads JSON plus human-readable conformance reports as artifacts. - vscode: added the Libraries surface under Project for reusable ST libraries, including packaged OSCAT and PLCopen Motion curated choices, vendored per-project dependencies, local-folder and Git add flows, expandable function block/function/type browsing, remove/update actions, and shared truST webview theme coverage. The bundled examples now include a portable PLCopen Motion single-axis starter with a vendored motion library and mapped Live Values proof points.
- trust-runtime: added the staged Beckhoff ADS client import workflow with
deterministic
ads.toml+ cached symbol snapshot validation, generated ST value/_qualityglobals, scan-safe background worker/cache handoff,[runtime.ads]bundle loading and runtime scan-cycle wiring, on-change/cyclic ADS notification caching, first-class HMI/debug/historian/OPC UA surface coverage, explicit plain-ADS security warnings and route-write guardrails, CLI failure-mode coverage, the runtime-host/setup/adsonboarding wizard, VS Code ADS commands that reuse the selected Runtime pane context, route artifact generation/removal, remote plain-TCP route-add through the local CLI without forwarding TwinCAT credentials to the runtime, ADS Doctor/status surfaces, multi-target UDP broadcast discovery, liveads browsesymbol listing andads validate --livesymbol validation, guarded Doctor write probes with read-back/restore verification, non-Windows ADS-client StaticRoutes.xml flags, Usermode Runtime route-file discovery, compatible-symbol filtering during live uploads, preview-before-write symbol import, and an offline communication example that compiles without a PLC. - trust-runtime: added Beckhoff ADS server support for exposing selected
runtime globals as ADS symbols through
[runtime.ads_server], including a standalonetrust-ads-serverprotocol crate, fail-closed source-pinned client allowlists, loopback Doctor/status/symbol control surfaces, route artifacts for external clients, audited write-back through a dedicated ADS server write port, online-change symbol-table refresh withSYM_VERSIONbumps, pyads smoke proof tooling, stale snapshot quality reporting, and an ADS server communication example; production readiness still requires a real TwinCAT external-client lab gate. - trust-runtime/vscode: added the native
Structured Text: Communicationsurface with typedcomm.capabilities,comm.schema,comm.apply, andcomm.testruntime control responses, one palette-visible Communication command, hidden-but-compatible ADS command entry points, capability-backed protocol cards, runtime-owned I/O driver setup forms, restart-required apply feedback, explicit multi-instance add/update controls, public-docs actions, rendered card/status/intent UX polish, bounded Modbus/MQTT connection tests, and secret-channel blocking for unsafe remote plain-TCP setup. - vscode: added the
Structured Text: Network Canvasfirst-run topology surface with a zero-config simulator path, intent chooser, guided simulated device setup, strict-CSP rendering, and real runtime-backed first-green states: the canvas now starts the local simulator through the shared runtime lifecycle service, keeps runtime/device nodes pending until status and I/O values are proven, and renders explicit retry/port/log fallbacks for startup failures. The canvas add flow now renders schema-driven setup for the I/O driver family (Modbus TCP, MQTT, EtherCAT, GPIO, simulated, and loopback) through the runtimecomm.schema/comm.apply/comm.testcontract, supports multi-instance add/update/remove controls without overwriting existing drivers, and adds searchable palette/quick-add/template paths, click-to-pin focus, keyboard navigation, fault navigation, terminal overflow handling, and per-edge communication roles. The canvas renderer is split into stage, graph, presentation, and style modules, and the runtime now exposes a Viewer-gatedfleet.topologycontrol surface so VS Code can render Host -> Runtime -> Endpoint fleet topology, degraded endpoint faults, and per-edge mesh/runtime links from runtime evidence instead of fabricated canvas state. The fleet surface now uses a dedicated responsive layout with full-width host/runtime cards, wrapped endpoint labels, a non-overlapping status/footer bar, and search dimming that never changes raw endpoint health or fault rollups; its wide and narrow webview states are now guarded by a headless geometry overlap check wired into the VS Code test script. Thefleet.topologyschema now reports real discovery-backed peer hosts, service-bound liveness evidence, per-endpoint live I/O snapshots, MQTT shared broker nodes, host/container facts, and an additivediscovered[]feed without serializing configured secrets. The fleet contract now emits schema version 3 with explicit link IDs and per-link roles, an ADS client endpoint for[runtime.ads], and configured counterpart nodes/links for ADS targets, Modbus TCP devices, and EtherCAT segments so the canvas no longer needs to infer or fabricate those graph relationships. - trust-runtime: added offline
trust-runtime comm schema,comm topology, andcomm applyCLI commands so VS Code can inspect and edit communication settings from project files without a running runtime; offline topology now includes redacted endpoint params for setup prefill while keeping live status non-green until runtime evidence exists. - trust-runtime: advanced the Communication/Network Canvas setup contract to
comm.schemaversion 4 with device-first protocol categories, config-home metadata, ADS/ADS-server schemas, and universal file-writingcomm.applybehavior forio.toml,runtime.toml, and ADS runtime setup instead of detached paste snippets. - trust-runtime: made OPC UA wire/server support part of the default runtime
build and added
comm.schemaavailability metadata plus a schema-vs-capability regression gate so user-visible default communication protocols cannot be advertised without being compiled into the runtime for the current platform. - trust-runtime: added offline
trust-runtime fleet runtime addandtrust-runtime fleet listcommands for Network Canvas host-level runtime setup; the newfleet.tomlmanifest registers sibling runtime projects, creates loopback-only control/web endpoints with per-project control tokens, and keeps newly-created runtimes offline/configured until they are actually started. - trust-runtime: added
comm.discoverandcomm.browse_symbolscontrol/CLI surfaces for the Network Canvas Browse/Connect flow; the first slice can discover ADS targets, truST runtimes, connect-only Modbus TCP endpoints, and targeted MQTT brokers, returns an honest server-only warning for OPC UA instead of orphaned client candidates, and can browse ADS symbols as a generic tree while reusing the existing ADS import/generate-ST candidate payload. - trust-runtime: completed the Network Canvas Browse/Connect backend by adding
offline local-global symbol browsing for OPC UA server, ADS server, and
OpenOT expose pickers; exact selected-tag
ads.import_symbols.applywritesads.toml, cached symbol snapshots, and generated ST through the existing ADS import pipeline; EtherCAT endpointchildren[]/channel browsing now come from configured modules; and runtime-origin EtherCAT/GPIO discovery now reports real observed bus/modules or GPIO lines without write probes. - trust-runtime: made ADS client wire support and the ADS server part of the default runtime build so normal release binaries include the ADS functionality validated with TwinCAT, without requiring custom feature flags.
- trust-runtime: added
trust-runtime check --json/--cifor VS Code's real Check program backend; it validates project config and compiles sources to bytecode in memory without writingprogram.stbc, returning structured issues for editor rendering. - trust-runtime: added managed local-runtime lifecycle commands under
trust-runtime fleet runtime start|stop|status|logs; they build registered sibling projects before launch, run the local runtime as a background process with captured logs, report reachability through the control endpoint, and stop through the existing runtime shutdown verb. -
trust-runtime: added the OPC UA client backend for Network Canvas peer links, including the
opcua_clientschema,opcua_client.tomlfile writer, targeted discovery/test/browse flows, reversible client certificate trust-store CLI, offline non-green fleet topology, and scan-cycle read/write polling that only reports live status after real OPC UA reads. -
trust-runtime: OpenOT telemetry can now publish real encoded records from a configured ST OpenOT producer FB via
[runtime.openot] source = "st-fb"andproducer_instance, while keeping the existing heartbeat publisher as the default. - trust-runtime: OpenOT ST-FB telemetry now supports multi-PROGRAM authoring by
draining a configured
producer_instances = [...]list into one shared ring, with deterministic per-program source ids and collision diagnostics. - trust-runtime: ST OpenOT producer telemetry now hands off multi-record
transition bursts through the producer FB
ScanRecordsdescriptor outputs, while fail-closing scans whose published-record delta does not match the descriptor count. - trust-runtime: OpenOT declaration attributes (
{attribute 'oot' := ...}) now lower to the hidden ST-FB producer path for value, state, message, and alarm records, including enum-typed state variables whose HIR enum values populate StateTransition payloads and definition-file enum sets, with a reactor example that emits a UTC-rendered, runtime-clocked typed audit log, definition file, and forced-overflow reconciliation artifact. - trust-runtime/trust-lsp: OpenOT authoring now supports the simple
operator/regulated edge events
operator-action,operator-login,operator-logout, andsecurity-failure, including authResult symbol lowering, boundedcontextRefbindings, runtime ST-FB emission, renderer support, completions, validation, and inlay hints. - trust-runtime/trust-lsp: OpenOT audited value declarations now emit
ParameterChangerecords viaaudit := 'true', with compile-time string width and record-size validation, producer baseline rollback on fail-closed drops, resolved audit rendering, completions, diagnostics, and inlay hints. - docs: added a public OpenOT attribute-authoring guide covering the truST
compiler diagnostics, language-server assistance, generated producer path,
definition-file generation, value sampling policies, and
[runtime.openot]source = "st-fb"runtime configuration. - examples/docs: added an OpenOT multi-PROGRAM project showing two
attribute-generated producers drained through
producer_instancesinto one shared ring. - Added fail-closed runtime boundary watch envelopes for
trust-harnessprotocol v2 andtrust-devagent harness snapshots. Unresolved watch paths now carry structuredstatus: "error"entries instead of silently becomingNULL. - Added a runtime boundary fail-closed architecture gate wired into
architecture-doctor --full-mapand CI. - Added a
trust-devdeveloper/workbench CLI binary. The first migrated command istrust-dev commit, and release runtime archives now shiptrust-devbesidetrust-runtimeandtrust-bundle-gen. trust-dev agent servenow owns the external agent JSON-RPC server. The legacytrust-runtime agent serveentrypoint remains as a deprecated forwarding alias during the product/workbench CLI split.trust-dev docsnow owns ST API documentation generation, andtrust-runtime docsremains as a deprecated forwarding alias during the product/workbench CLI split.trust-dev testnow owns ST test discovery/execution, andtrust-runtime testremains as a deprecated forwarding alias during the product/workbench CLI split.
Removed¶
- trust-runtime: removed the abandoned digital-twin/world proof stack, including
the Scena/URDF robot-arm dependencies,
RobotP3MinimalArmbuilt-in function block, world-smoke fixtures, and transform-handoff lint script. The release keeps the normal simulator/runtime surfaces and no longer ships a digital-twin or trust-twin runtime path.
Changed¶
- vscode/docs: documented the shipped product contract for the truST sidebar,
Live Values, Devices & Connections, examples, libraries, HMI, and visual
editors; public guides now use the current Compile, Live Values, and direct
+ Addworkflows instead of retired Runtime Panel, Check, and Edit-mode wording. - branding: replaced font-dependent truST wordmarks and product icons with self-contained path-based assets across the public documentation, runtime Web IDE, and packaged VS Code extension.
- vscode: normalized simulator copy across the sidebar, Devices & Connections,
Live Values, new-project template, and bundled examples so the local runtime
appears as
Simulatorand its local endpoints appear asSimulated I/O/Loopback I/Oinstead of mixingtruST runtime,local simulator, and bare protocol names. - vscode: normalized online-change wording across the sidebar command, command
palette, language-model tool, toasts, and runtime feedback so the user-facing
verb is consistently
Updateinstead of mixing update and hot-reload terms. - vscode: clarified Examples Gallery badges and filters so hardware-required
starters use the shared warning role while category chips display readable
labels such as
ADS,Raspberry Pi, andEtherCAT. - vscode: clarified Libraries row actions and counts by renaming read-only
library access to
View source, showing versioned update buttons such asUpdate to 0.1.0, and using singular/plural symbol counts consistently. - vscode: aligned Devices & Connections runtime setup panes with the shared
inspector breadcrumb so
Set up runtimeandConnect existing runtimeread as part of the same right-pane shell. - vscode: changed Devices & Connections endpoint edit breadcrumbs from role
badge wording such as
CLIENT editto task wording such asEdit Modbus TCP. - vscode: styled the open project name in the truST sidebar as a project identity row with a folder icon so lowercase project names no longer read as placeholder copy.
- vscode/runtime: removed the unfinished 3D twin prototype, typed LM tool, packaged WASM/assets, scene-page HMI contract, and related activation/build and test wiring from the shipped product surface so the PLC IDE focuses on the accepted Run, Devices & Connections, Live Values, HMI, and visual-editor workflows.
trust-harnessnow defaults to JSON protocol version 2 and accepts--protocol-version 1orTRUST_HARNESS_PROTOCOL_VERSION=1for the legacy watch-value map shape during migration.trust-runtime commitis now a deprecated compatibility alias that forwards totrust-dev commit, preserving the existing command while the product runtime CLI is split from workbench/dev commands.- Public docs and terminal capture scripts now point agent automation workflows
at
trust-dev agent serve, withtrust-runtime agent servedocumented as a compatibility alias. - Public docs, CI templates, flake probes, and terminal capture scripts now
point ST test and ST documentation workflows at
trust-dev testandtrust-dev docs. trust-runtime test,trust-runtime docs,trust-runtime commit, andtrust-runtime agent servewarnings now include thetrust-devcanonical command and a removal-not-before date of 2026-10-05; actual alias removal requires a separate behavior-change release note.- Local Rust test recipes now use the
moldlinker on Linux when it is installed,just test-alland CI no longer runcomplete_programtwice, andjust test-hir-fastprovides a focused HIR refactor loop before the final full workspace gate. - VS Code extension tests now build and resolve the required local
trust-debugadapter and reuse the Linux fast-link Rust wrapper for local Rust build steps. - OSCAT OOP now uses the settled
OscatOopdependency alias, concrete types in simple examples,PidGainsplusConfigure(...)for PID setup, clearer PID/calendar/astronomy names, and example coverage forSnapshot()and configuration error handling. - MQTT I/O now supports explicit TLS/mTLS configuration instead of carrying
unused default TLS dependencies:
io.params.tls = truerequirestls_ca_path, optionaltls_client_cert_path/tls_client_key_pathenable client authentication,mqtts://andssl://broker schemes imply TLS, Linux release builds use vendored OpenSSL for the selected native TLS backend, and remote plaintext brokers still requireallow_insecure_remote = true. - GPIO I/O now defaults new configurations to the Linux GPIO character-device
backend (
libgpiod/chardev) while keeping legacysysfsselectable, and setup surfaces expose the GPIO chip path alongside the existing line mapping help. - The default OSCAT OOP example catalog test now keeps the all-example folder,
README, source-layout, and pattern checks in the normal Rust suite while
moving the expensive 98-project
trust-runtime test --projectsweep behind an explicit ignored gate with per-project progress, child PID/elapsed reporting, and timeout diagnostics. - The runtime VM benchmark gate now records per-fixture metrics, confidence
spread, optional baseline compare deltas, and
quick-low-noise/full-low-noiserepeated-run profiles in its artifacts. - The runtime VM malformed-bytecode fuzz smoke gate now records progress-visible logs and summary artifacts for deterministic bytecode mutation coverage.
- The runtime VM default-switch readiness ledger now records production-guard, differential, malformed-bytecode fuzz, benchmark, residual-risk, and rollback evidence without pretending blocked performance thresholds are ready.
- VM function and method local initialization now populates VM frame slots directly for initialized locals, static locals, and function-block local member overrides instead of creating a temporary runtime storage frame on the native-call path.
- trust-runtime: documented the stable signed-integer materialization policy:
representable
SINT/INT/DINT/LINTresults retain their exact value and destination tag, while range overflow fails before storage instead of wrapping, saturating, truncating, or substituting a value.
Fixed¶
- trust-runtime: typed process-image
REALandLREALoutput bindings now reject non-finite values transactionally before changing%Q/%Mbytes or committing output to a physical driver. - trust-runtime: finite
REALEXPandEXPTcalls now fault before assignment when their basic-single result would be NaN or infinity instead of storing a non-finite process value. - trust-runtime: finite
REALbinary arithmetic now faults before assignment when its basic-single result would be NaN or infinity instead of storing a non-finite process value. - trust-runtime:
simulation.tomlnow rejects NaN and infinite coupling thresholds before activating the configuration instead of silently selecting a coupling branch. - trust-debug: managed Live Values writes and forces now parse declared
REAL/LREALvalues semantically and reject NaN, infinities, width overflow, and raw non-finite bit encodings before changing process-image or force state. - trust-hir: cross-file POU imports now preserve
STRING[n]andWSTRING[n]capacities derived from project constants, so equal-capacityVAR_IN_OUTbindings no longer fail as bounded-to-unbounded mismatches. - trust-runtime: file-backed retain snapshots now reject non-finite
REAL/LREALvalues recursively on save and load, preserving the last good durable image and preventing partial application of an invalid snapshot. - trust-runtime: mesh subscriptions now reject integer values outside the subscribed IEC type's range and reject floating-point conversions that would produce a non-finite PLC value instead of silently wrapping or storing infinity.
- trust-runtime: OPC UA client
Float/Doubleinput samples now rejectNaNand positive or negative infinity before cache acceptance, mark the affected point faulted, and leave the PLC target unchanged. - trust-ads-core/trust-runtime: ADS
REAL/LREALclient reads, notifications, arrays, and server writes now rejectNaNand both infinities before cache acceptance, server write queuing, or PLC storage mutation. -
trust-hir/trust-runtime: compile-time bounded
STRING[n]andWSTRING[n]literal checks now count Unicode scalar values; call binding rejects width-changingVAR_IN_OUT, and function/function-block output copy-back honors the receiving declaration's capacity. Metadata-free legacy v1.1 bytecode now fails closed when a local string output target's declared type cannot be recovered; compiler and runtime must be upgraded together for this boundary. -
trust-runtime: in-process warm and cold restarts now preserve monotonic runtime time while reinitializing timer and task baselines at the preserved value, preventing restart from rewinding simulation time or charging pre-restart elapsed time to recreated timer instances.
- trust-runtime: bounded MQTT and Modbus input workers now preserve the typed
error from a completed protocol read instead of replacing MQTT connection
context and Modbus exception responses with a generic unavailable-snapshot
transport error; MQTT reads without a fresh snapshot report
IoFreshness. - trust-runtime: watchdog faults before physical output commit no longer re-send the pending process-image output when no safe-state outputs are configured; the resource faults visibly without issuing a driver write.
- trust-runtime: TOF and TOF_LTIME now hold
ET = PTafter the off-delay expires whileINremains false, matching IEC 61131-3 Ed.3 Figure 15(c), until a later true-input scan rearms the timer. - ci: release tests now tolerate loaded matrix runners for MQTT/Modbus scan-bound timing, runtime fail-closed state propagation, Windows index-cache mtime fixture updates, and Windows ADS diagnostics fixture line endings.
- ci: Modbus write-failure policy tests now use a deterministic local Modbus exception response instead of assuming a fixed localhost port is closed on every hosted runner.
- trust-runtime: Web IDE workspace path validation now rejects Windows rooted paths with the same absolute-path denial used on Unix, keeping release tests and browser-facing file-scope errors consistent across platforms.
- release: Windows packaging now installs Strawberry Perl before building vendored OpenSSL so release artifacts use the same prerequisites as CI tests.
- ci: Ubuntu release test jobs now serialize all-target Rust linking to avoid
hosted-runner
rust-lldbus errors before the test suite starts. - trust-runtime: Windows
trust-runtime.exenow links with a larger stack so CLI invocations such as ADS route and validation commands do not overflow the default Windows executable stack during release tests. - ci: Windows test jobs now install a full Perl toolchain before building vendored OpenSSL so cross-platform release gates do not fail on missing Perl modules.
- ci: macOS release tests now tolerate
/private/vartemp-path aliases and filesystems that reject invalid non-UTF8 fixture names. - ci: the regression-test-first guard now recognizes Rust module files named
tests.rsas focused regression-test evidence. - docs: public docs release gates now include the checked-in VS Code screenshot inventory entries, current regenerated PlantUML SVGs, and search-regression scoring for the intended VS Code, runtime-panel, and observability pages.
- build/source:
trust-runtimenow uses pinned public Git dependencies for the OpenOT Rust crates, so fresh clones and GitHub source archives can build without a pre-existing sibling../open-ot-refcheckout; the source-build guide now documents that the checkout script is only needed for OpenOT IEC examples and tests that read the ST source package. - vscode: Ladder visual editor right pane now matches the other visual editors' empty-property treatment and no longer repeats passive Rungs/Pan guidance that is already shown in the status bar.
- vscode: Statechart visual editor now keeps added states and transition labels inside the visible canvas at normal sidebar widths and keeps animation CSS out of node text.
- examples: the OpenOT multi-program example now includes a simulated
io.tomlso the normal project Compile/Run workflow can validate and launch it. - vscode: native Settings now contributes product-language
trust.*setting keys with legacytrust-lsp.*fallback, so first-user Settings labels no longer render under the internalTrust-lspheading. - vscode: Compile now distinguishes missing
trust-runtimebinaries from incompatible runtime check-report versions, with short product-language recovery text for Runtime path/update actions. - vscode: the truST sidebar now treats unreadable project manifests as a repair/no-project state instead of showing Target/Compile/Start controls for a project that cannot load.
- trust-plcopen: PLCopen import now accepts Structured Text POUs that include
benign body-level metadata such as
addData, while still rejecting graphical or unknown non-ST bodies with named diagnostics. - trust-syntax: ST exponentiation now follows IEC 61131-3 Ed.3 Table 71
left-to-right equal-precedence evaluation, and unclosed function-call
argument lists now report the missing
)diagnostic. - trust-dev:
trust-dev testnow discovers.stand.poufiles with mixed-case extensions under literal project paths containing glob metacharacters, andtrust-dev commitnow uses OS-safe scoped git pathspecs so unrelated pre-staged files outside the PLC project are not committed. - vscode: the MQTT Add form now exposes the runtime
On errorpolicy so users can choose scan-tolerantwarnhandling for local broker startup instead of editingio.tomlby hand for the successful MQTT use-in-ST path. - trust-ide/trust-lsp: rename now exposes structured refusal reasons and rejects unsafe renames that would capture references through local shadows or create imported-symbol origin conflicts instead of returning behavior-changing edit sets or silent no-op protocol responses.
- trust-lsp: references and workspace-symbol requests that stream partial results now return an empty final response instead of duplicating the streamed locations or symbols in the final payload.
- trust-lsp: cancelled diagnostics requests now fail closed at the protocol
boundary: pull diagnostics return
ContentModified, and push diagnostics skip publication instead of transiently clearing real errors with an empty successful diagnostics set. - trust-lsp: inline runtime values now bound runtime-control connect/read/write waits and return an empty inline-value result on timeout or transport failure instead of parking an LSP worker on a silent endpoint.
- trust-lsp: LSP position handling now advertises UTF-16 and maps hover ranges, incremental edits, diagnostics, refactor edits, and semantic-token start/length fields through UTF-16 code units so supplementary-plane characters no longer desynchronize editor buffers.
- trust-lsp: EOF positions on documents that end with a newline now round-trip through the line index without panicking, fixing inline-value requests whose range ends at the final empty line.
- trust-lsp: HMI TOML pull diagnostics no longer compile a runtime from
disk-only ST sources, so open buffers are not contradicted by stale
unknown binding pathwarnings; the pull path now keeps cheap TOML parse and local widget-property diagnostics only. - trust-ide/trust-lsp: semantic tokens, document highlight, references, struct-field go-to-definition, and call hierarchy now avoid repeated syntax-tree and whole-workspace scans on interactive paths, keeping large-workspace editor requests bounded by the new perf locks.
- trust-runtime: VM process-image stores and function/function-block parameter
copy-in now materialize HIR-legal numeric and bit-string widening into the
declared target tag, so assigning
INTvalues intoREAL/DINTstorage no longer leaves narrow runtime tags that compute integer division or overflow at the wrong width; bytecode VM function-blockSTRING[n]input and in-out parameter copy-in now also honors the declared bound instead of storing over-length strings in the FB instance. - trust-runtime: runtime writes to declared subrange storage now fail visibly
instead of committing out-of-range values across bytecode VM assignment,
function-block/function parameter copy-in, dynamic
REFwrites, HMI/control writes, and retain reload. - trust-runtime: bytecode encoding now rejects manually-mutated
VAR_ACCESSbindings that shadow globals, matching the source-level HIR diagnostics instead of silently rebinding bare global names to access-map targets. - trust-runtime/trust-hir: OpenOT authoring now reports explicit
sourceidownership collisions consistently in HIR and runtime validation, andCompileSessionfails closed on OpenOT instrumentation validation errors instead of building bytecode from uninstrumented source with zero telemetry. - trust-lsp: closing an unsaved file-backed dependency now restores disk truth for cross-file analysis, memory-budget eviction no longer removes closed files from the semantic project, and the persistent index cache verifies disk content before accepting same-size/same-second metadata hits.
- ci/build: Unix runtime signal-shutdown helpers and their unit-test fixtures
are now cfg-gated so Windows warning-deny and pre-push
trust-lsptest compile checks do not fail on unused Unix-only signal code. - trust-hir/runtime:
REF()now rejects function and method return variables before lowering, preventing source programs from persisting frame-local return slot references into longer-lived storage. - trust-runtime: bytecode validation now rejects crafted modules that persist
frame-local reference values into longer-lived storage or mix multiple baked
instance owners in one POU body, and catches operand-stack underflow,
non-empty POU exit stacks, known BOOL operands to arithmetic opcodes, and
incompatible constant stores to typed
STORE_REFtargets, invalid parameter direction metadata, and expression arguments bound to target-onlyOUT/IN_OUTparameters, legacyCALLopcode bodies, and inconsistent operand stack depths at control-flow joins before malformed bytecode can be loaded or executed. - trust-runtime: bytecode lowering now fails closed for unsupported statement
paths instead of silently emitting
NOP; label-only statements remain the explicit no-op path. - vscode: visual ST companions and runtime wrappers now map raw visual-editor
direct I/O operands through generated
ATglobals instead of emitting raw%I/%Q/%Mreferences inside function-block bodies, so the bundled visual examples keep compiling under the fail-closed bytecode lowering contract. - trust-runtime: hardened scheduler and process-image failure handling so resource-cycle panics become visible faults instead of silently killing the scan thread, enabled watchdog policies arm VM execution deadlines and reject zero-timeout scan bricking, Modbus/EtherCAT/MQTT non-fault I/O policies degrade health without faulting the resource, requested stops apply safe outputs and surface retain-save failures, and direct process-image writes are capped at a 16 MiB per-area limit.
- trust-runtime: moved Modbus TCP and MQTT wire/broker waits behind
protocol-owned workers so scan-cycle
read_inputsandwrite_outputsuse bounded snapshot/handoff state instead of blocking on delayed protocol responses, reconnect backoff, or missing fresh broker payloads. - trust-runtime: bounded EtherCAT hardware construction failures after the
ethercrab
PduStoragesplit boundary so a missing/unavailable adapter reports a terminal driver-rebuild-required state instead of repeatedly allocating storage during deferred retry windows. - trust-runtime: tightened runtime correctness boundaries by preserving TP
elapsed time at pulse expiry, enforcing bounded
STRING[n]ingress for assignments, retain reload, HMI writes, and process-image writes, rejecting non-finite REAL/LREAL ingress through HMI, string conversion, raw typed I/O, Modbus maps, and MQTT maps, releasing ADS notifications across symbol-version refresh/drop paths, treating rejected OPC UA point writes as point faults without reconnect churn, and validating online-change task metadata before resizing process images. - ci: restored OpenOT sibling checkout in the Nightly Reliability and HMI Long Soak workflows so path dependencies resolve in long-running reliability gates again.
- ci/release: pinned OpenOT checkout, added release tag/CI preflight, changelog-backed release bodies, SHA256 checksums, cargo-deny/cargo-audit supply-chain gates, and conformance/architecture-safety coverage in the release gate report.
- docs/tooling: made
AGENTS.md,CLAUDE.md, and repo skills the shared versioned agent rule source, added Claude/Codex permission guardrails, and fixed stale HMI and IEC instruction paths. - vscode: the Libraries symbol browser now searches and pages through the full library symbol list, shows declaration detail for the selected symbol, and can insert or copy a declaration snippet instead of rendering a capped list of inert chips.
- trust-runtime/vscode: GPIO setup fields are now conditional on the selected backend, so the default libgpiod form hides legacy Sysfs base settings while sysfs mode hides the libgpiod chip field.
- vscode: Devices & Connections server inspectors now show the server endpoint and exposed globals after OPC UA/ADS expose flows, preserve ADS pinned-client config while reapplying expose changes, and carry ADS live client-count evidence through to the inspector when available.
- vscode: Devices & Connections runtime nodes now project the shared selected
run target back onto the canvas and inspector with a neutral
Run targetbadge, soSet as run targetgives persistent visible feedback. - vscode: visual editors now distinguish
Preview STfromGenerate ST, with tooltips that state whether the action only previews generated code or writes a companion.stfile. - vscode: Devices & Connections discovery now treats reachable
Onlineruntimes as valid EtherCAT/GPIO scan origins instead of leaving hardware scans disabled until a debug-attachedrunningstate appears. - vscode: visual editors now share keyboard/canvas chrome: Blockly toolbox focus uses the truST focus ring, and SFC/Statechart expose the same themed canvas zoom controls as Devices & Connections.
- trust-runtime/vscode: stopped/configured Devices & Connections nodes now use one consistent "runtime is not running" state phrase across runtime and endpoint inspectors instead of mixing project-file and live-health wording.
- vscode: Devices & Connections now preserves the stopped project runtime when a managed local runtime starts, so the topology updates state in place instead of silently removing a runtime node the user just saw.
- vscode: HMI Process SVG previews now inherit the shared truST theme roles, so generated process diagrams no longer render as a white slab inside the dark VS Code theme while remaining readable in Light Modern.
- trust-runtime: Browser HMI cards now suppress standalone unit rows for
widgets whose renderer already shows the unit inline, avoiding duplicate
%/barlines under setpoint and readback values. - trust-runtime: Browser HMI now separates passive header status chips from clickable header actions, including moving the theme toggle into the action group and giving actions visible button affordance.
- trust-runtime: Browser HMI alarm banners and alarm tables now use configured alarm labels while keeping the raw signal path as tooltip detail, so operator alarms do not expose variable-name labels when a human title exists.
- vscode/trust-debug: starter projects and bundled examples now include a
native
truST Simulatorlaunch configuration, and Structured Text debug stack frames display workspace-relative source names while keeping absolute paths for navigation, so the Run and Debug view no longer showsNo Configurationsor long local paths during first-use debugging. - vscode: Devices & Connections now exposes a first-class
+ Addtoolbar action that opens the device/connection picker for the selected/default runtime, instead of teaching first-time users to discover the primary add flow through Edit mode. - vscode: Devices & Connections discovery now disables EtherCAT/GPIO hardware scans with an inline reason until a running runtime is selected, and empty scan results explain concrete recovery checks instead of vague runtime plumbing.
- vscode: Browse tags/nodes now clears stale selections when browse results disappear and keeps Add/write controls neutral-disabled with a visible reason when there is nothing valid to add.
- vscode: OPC UA browse authentication warnings now include an inline
Edit credentialsrecovery action that reopens the connection form with the failed endpoint values prefilled. - vscode: SFC diagrams now use clearer IEC-style initial-step and transition markers so the visual editor reads as SFC instead of a generic flowchart.
- vscode: Ladder diagrams now render symbolic names above mapped
%I/%Q/%Maddresses and use neutral edit-time strokes, reserving status colour for live power-flow. - vscode: visual editor right panes now share the same Tools/Edit/View section order, with Fit View in the pane and Show Code labeled as a generated-ST preview instead of a save action.
- vscode: invalid SFC, Statechart, and Blockly visual-editor files now show an
Open as textrecovery action so users can fix malformed JSON directly in the default VS Code editor. - vscode: Blockly now uses a truST-themed workspace, toolbox, flyout, and muted block palette derived from the shared webview design tokens instead of raw default Blockly hues.
- vscode: Advanced integration cards in the Devices & Connections Add picker
now use intentional badges (
MESH,OT,RT,CLOUD) instead of truncated protocol fragments. - vscode: Simulated and Loopback endpoint node titles now use matching local I/O
naming, leaving the
I/Orole label to the node band. - vscode: Boolean fields in Devices & Connections protocol forms now render as native checkboxes with On/Off labels instead of dropdowns.
- vscode/runtime: generated protocol-form copy now preserves acronym casing in empty states, avoids schema-defaults wording for saved secrets, and the Libraries surface pluralizes symbol counts correctly.
- vscode: Devices & Connections now lands on the saved endpoint after a successful add-device Save, keeps the success result visible, and resolves the selected node from the refreshed topology when the apply response omits an instance id.
- vscode: Devices & Connections draft/advanced mesh fabric nodes now use one
muted draft treatment, with an opaque label knockout and separate
DRAFTchip so dashed wires never read as live state or run through text. - vscode: Compile diagnostics now use the user-facing
truSTProblems source label instead of the staletrust checkname, and Compile resolves the nearesttrust-lsp.tomlfrom the active file before falling back to the workspace root. - vscode: Devices & Connections inspectors now render lifecycle details as a
single Title-Case
Staterow, hiding backendmode/status/detailduplicates unlessModeadds real target context such as Simulator or Managed. - vscode: Blockly editor status now counts all visible Blockly blocks from the live workspace instead of reporting only serialized top-level stacks.
- trust-debug/trust-runtime: debug Variables and Watch/Evaluate output now show
function block/program instance type names instead of leaking raw
Instance(id)runtime handles. - trust-runtime: ST test assertion failures now format expected and actual
values as user-facing ST values instead of leaking Rust enum wrappers such as
Int(1)orReal(1.5). - vscode: refreshing the native Test Explorer now preserves pass/fail state for unchanged Structured Text tests instead of clearing the gutter/status evidence immediately after a run.
- vscode: Live Values now shows a
Forced (N)filter chip when overrides are active, letting operators list only forced points before releasing or inspecting them. - vscode: Live Values now explains the force ceremony in-panel, distinguishing
immediate simulator forcing from the managed/remote
Arm forceflow so the two target types do not look inconsistent. - vscode: Devices & Connections and Live Values now reserve red alarm styling for real failures: stopped local runtimes render as neutral guidance, local socket paths are humanized, and viewer-role permission guidance uses the warning treatment instead of the danger treatment.
- vscode: shared webview theme tokens now handle VS Code High Contrast and High Contrast Light explicitly, so visual editors, Devices & Connections, and other product webviews no longer render as dark/navy or white forced-colors islands under high-contrast captures.
- vscode: Devices & Connections now keeps simulator-mode topologies under one
Simulatorruntime and refits populated remote/auth-failure graphs, so the canvas, summary, and status bar no longer contradict each other during GPIO scans or token-error recovery. - vscode: the extension test runner and development binary resolver now honor
CARGO_TARGET_DIRwhen locating builttrust-lsp,trust-runtime, andtrust-debugbinaries, keeping isolated remote-builder gates aligned with warmed target-cache builds. - vscode: Live Values now renders row Write/Force controls as quiet secondary actions, marks active forces with amber warning treatment instead of success green, and keeps forced rows readable by removing the stale editable value control while showing a disabled Write reason plus Release.
- vscode: Structured Text snippets now prefer identifier-friendly completion aliases while preserving the readable hyphenated aliases, making snippet completions deterministic in the extension test harness.
- trust-runtime/vscode: Live Values snapshots now come from one final post-logic runtime scan with per-snapshot force markers and a visible scan number, preventing stale rows from being decorated with newer force state.
- trust-debug/vscode: running-simulation updates now suppress pre-scan reload I/O events and the conveyor example no longer overlaps bit and word outputs, keeping Live Values update evidence logically consistent.
- vscode: Live Values now auto-expires short success feedback such as released forces while leaving standing-state banners, including active forces and permission-denied guidance, visible until the state changes.
- trust-runtime/vscode: Live Values rows now carry runtime-owned source provenance when available, so mapped Modbus/MQTT rows show the driver endpoint or topic directly in the panel instead of relying on ST comments.
- vscode: Live Values now labels local control-socket targets as
Local runtime (control socket)while keeping the full socket path in the tooltip, so temporary socket filenames no longer leak into the panel header. - vscode: Live Values now includes a compact DEC/HEX/BIN display toggle for
word-like numeric rows, rendering IEC-style
16#and2#literals without changing write/force parsing. - trust-debug/vscode: Live Values now preserves configured I/O value types from
the runtime snapshot, so REAL, TIME, and fixed-length STRING rows render as
typed values instead of raw DWORDs/bytes and local writes accept
1.5,T#250ms, and text values. - testing: VS Code UX evidence PNG hygiene now strips color/text/time chunks and hashes decoded pixels, so duplicate screenshots cannot bypass review by differing only in PNG metadata. The runtime I/O cycle snapshot test now asserts the post-output-commit snapshot contract with a bounded timeout instead of hanging broad gates when a snapshot is missing.
- vscode: Live Values now explains program-driven outputs and memory rows in the panel and on disabled Write controls, pointing users to Force for simulation overrides instead of leaving greyed actions unexplained.
- vscode: Live Values now maps disconnected I/O transport failures to user-facing reconnect guidance instead of surfacing raw socket or cancellation text in the panel.
- vscode: HMI Preview now refreshes through the shared descriptor debounce when HMI descriptor or process SVG files are edited in an open workspace, keeping the panel current without waiting for a separate manual refresh.
- vscode: Live Values now clears stale connected/value rows as soon as a
Structured Text debug session stops or disconnects, keeps remote
disconnected targets labelled
Not connectedinstead of fabricatingRunning, and retries transient runtime-busy write/force/release requests before surfacing a user-visible failure. - vscode: Devices & Connections now only labels a fleet host as
This computerwhen its reported identity also matches a local interface, so remote runtimes on machines with lab-builder hostnames render as genericComputer <address>headlines instead of misleading local-machine labels. - vscode: Add Device forms now clear stale field validation and hide stale apply banners as soon as the user edits the rejected field, so corrected example values no longer remain marked invalid before the next Save.
- vscode: the
Update running simulationcommand now uses the same compile and config gate as the sidebar button, returning the disabled-with-reason message instead of attempting hot reload from an invalid project. - vscode: Live Values now keeps long signal names inside a capped name column, preserves VALUE/TYPE/STATE/ACTIONS alignment at narrow widths, and exposes the full signal/address in the row tooltip instead of letting names overlap values.
- vscode/trust-runtime: Devices & Connections now renders ADS server allowed
clients as readable pins such as
127.0.0.1.1.100 (from 127.0.0.1)and no longer sends the raw ADS client allowlist objects through the topology inspector payload. - vscode/trust-runtime: Live Values now receives runtime role/capability data from the control channel, disables viewer-role Write/Force/Release controls before any unsafe attempt, and shows a visible engineer-token recovery reason; remote auth recovery now distinguishes missing tokens from rejected tokens, managed Stop clears the selected-runtime status consistently, and Update running simulation reports success or compile-failure recovery without leaking raw source paths.
- vscode: the sidebar Start, Debug, and Update-running-simulation controls now
stay visible but disable with a plain recovery reason when compile or
runtime.tomlerrors mean the action cannot succeed. - trust-runtime: advanced communication setup schemas now use one configured-only note for Mesh, Realtime T0, and Runtime cloud so draft links cannot read like live runtime proof.
- examples: OPC UA server and ADS server expose examples now update the exposed globals from ST each scan so protocol proof can show value changes instead of reading only initializer constants.
- vscode: tightened the first-run/sidebar UX by restoring the distinctive
stacked
tru/STactivity icon, replacing the Project bucket with one compact sidebar control surface, making Start from example the no-project primary path, exposing Libraries as a first-class destination, renaming project validation to Compile, and adding the Examples Gallery surface for curated runnable starters. - vscode: Examples Gallery filters now combine hardware requirements and categories and include a clear no-match reset state, so users can find a runnable starter without scrolling a flat list.
- trust-debug/vscode: internal debug-adapter lifecycle trace now uses internal
DAP events instead of the visible Debug Console, so first-time debugging no
longer exposes raw
[trust-debug]backend logs. - vscode: Devices & Connections runtime inspectors now show a direct
Set auth tokenrecovery action for remote runtime authentication failures, reusing the SecretStorage-backed token command instead of leaving users to infer the fix from Settings. - vscode: Run target labels now keep the remote control port, so two runtimes on
the same host no longer appear as identical
127.0.0.1entries. - vscode: shortened bundled starter descriptions in the Start from example picker so hardware notes and first-run purpose text remain readable instead of clipping in the clean-profile onboarding flow.
- trust-runtime: HMI schema generation now marks only explicitly allowlisted
[write]targets as writable/read-write, so browser HMI slider/toggle controls are enabled for safe configured writes without making the whole HMI writable. - trust-runtime/vscode: Devices & Connections endpoint Disable now preserves I/O
drivers as disabled instead of deleting them, skips disabled drivers at
runtime/deploy validation, keeps disabled endpoints visible and non-green in
fleet.topology, and exposes a schema-driven Disable action in the endpoint inspector with explicit re-enable guidance. - trust-runtime/vscode: MQTT setup validation now reports missing TLS CA paths,
mismatched client certificate/key paths, TLS-field misuse, and broker-format
errors against the relevant setup fields, uses an MQTT port example for
broker errors, and treats the schema's empty TLS ALPN default as empty so
Devices & Connections can highlight the exact field instead of showing only a
generic blocked-save message; MQTT broker Test results now use honest
broker-port reachable/not-reachable wording, keep unresolved broker errors
attached to the Broker field, and render saved MQTT broker nodes from fleet
topology instead of leaving publish/subscribe links hidden. The ADS/OPC UA
server expose picker now strips topology-only evidence fields before saving,
so selected globals are persisted instead of being rejected by
comm apply. - vscode/trust-runtime: Devices & Connections endpoint summaries now expose the existing Communication Test action for testable endpoints, translate structured OPC UA client endpoint failures into user-facing recovery text, classify rejected OPC UA anonymous logins as authentication-required recovery, and summarize configured connections instead of rendering raw JSON blobs.
- vscode: the truST sidebar now distinguishes an open non-truST folder from the no-folder first-run state and offers an explicit "Initialize truST here" action instead of showing the generic create/open/example welcome.
- trust-lsp/vscode: Move Namespace now asks the LSP for the computed workspace edit, applies it through VS Code in a text-edits-before-cleanup order, pre-creates missing target files, and removes an empty pre-created target on failure, so VS Code no longer reports success after leaving an empty target file and unchanged references.
- vscode: the namespace refactor command is now labeled "Move Structured Text Namespace" in the Command Palette and editor code action, so the advanced refactor no longer appears as the ambiguous bare "Move Namespace" command.
- vscode: stale package contribution and legacy Live Values titles now use "Devices & Connections" and "Live Values" instead of the retired "Network Canvas", "Runtime Panel", or "Structured Text Runtime" wording.
- vscode: starting the simulator from the truST Run card no longer auto-opens VS Code's Debug Console with raw adapter logs, keeping the first-run running state focused on product surfaces.
- vscode: attach-mode debug sessions no longer auto-open VS Code's Debug Console with raw adapter logs, keeping managed-runtime Start/Connect flows focused on Devices & Connections and Live Values.
- vscode: managed-runtime Start/Stop in Devices & Connections now refits when endpoint nodes appear or disappear, and managed runtime logs are summarized as readable event lines instead of raw JSON records.
- vscode: Devices & Connections now uses the shared truST webview product chrome for its Add pane, so visual-editor right panes and the device setup pane resolve the same title, panel, input, and button theme treatment across Dark+, Light+, and High Contrast themes.
- vscode: Devices & Connections protocol setup forms now use the same shared truST form chrome as the rest of the canvas, and starting a new add/edit workflow clears stale validation banners so one protocol's failed save cannot leak into the next form.
- vscode: Devices & Connections add/edit validation now shows a concise
field-issue banner that fits the toolbar, and saved Modbus endpoints render
as "Modbus TCP" in the graph instead of leaking the raw
modbus_tcpdriver id. - vscode: Devices & Connections endpoint edit forms no longer reset in-progress field changes when background topology refreshes deliver the same endpoint parameters with a new object identity.
- vscode/trust-runtime: Devices & Connections EtherCAT Browse channels now saves selected PDO channel paths back to the EtherCAT driver config instead of incorrectly routing them through the ADS tag-import flow.
- vscode: Devices & Connections endpoint inspectors now render user-facing
status labels such as "Configured" instead of raw backend health IDs such as
configured_policy. - vscode: visual-editor right panes now use surface-specific titles such as "SFC editor" and the shared truST section/button chrome, removing the generic "Editor tools" title and private Ladder/Blockly panel styling that made those editors look like separate products.
- vscode: Blockly toolbox category labels now use the shared normal foreground theme token instead of accent-button text, keeping the toolbox readable in Light+, Dark+, and High Contrast themes.
- vscode: Live Values now uses the same shared truST product theme roles as Devices & Connections and the visual editors instead of a private color-token layer, so cross-surface color checks compare equivalent UI roles.
- vscode: Devices & Connections, SFC, and Statechart canvas grids now use the same shared truST grid-line role instead of separate raw VS Code color variables.
- vscode: Devices & Connections node-summary actions and shared React Flow canvas controls now use the shared truST product chrome, closing the remaining visual-editor parity gaps in Dark+, Light+, and High Contrast themes.
- vscode: the create-project scaffold now writes a
src/config.stCONFIGURATION that instantiatesMain(RESOURCE + TASK +PROGRAM Main WITH MainTask), so a brand-new project opens clean instead of tripping the W009 "unused program" lint on first open (F-02). - trust-debug: the debug/simulator control server now serves HMI schema and
value requests from the launch project and live debug snapshot, so VS Code's
HMI Preview can render against a running simulator instead of timing out on
hmi.schema.get. - trust-debug: simulator launches now load the project
io.tomldriver stack and direct debug-runtime builds size process images from I/O bindings, so Live Values reflects simulated/loopback I/O updates instead of showing forced outputs that never reach mirrored inputs. - vscode: managed local runtimes now import their generated control token into SecretStorage and attach after a successful Start, so Live Values can read, write, force, and release values without manual token setup.
- trust-debug/vscode: Live Values Force and Release now use attach-safe
debug-adapter I/O requests for managed and remote runtimes instead of
setExpression, and managed-runtime token import now accepts both table and dottedruntime.control.auth_tokenTOML forms without rewriting the same SecretStorage entry on every refresh. - trust-runtime: OPC UA server startup no longer aborts when the first runtime
snapshot is not available yet; the server binds immediately and publishes
exposed nodes after real snapshot evidence arrives. Runtime debug breakpoint
control now accepts project-relative source paths such as
src/main.st. - trust-runtime: OPC UA client node browsing now returns each leaf's raw
node_idplus an apply-ready scalardata_type, and OPC UA client browse/test failures now include structured reason codes for certificate, authentication, reachability, browse-denial, and security-profile errors. Explicit OPC UA client certificate trust now promotes a previously rejected server certificate into the trusted store before reconnecting, so the Devices & ConnectionsTrust certificateaction can recover from the first untrusted browse attempt. - vscode: release packaging now bundles
trust-runtimeinside the VSIX next totrust-lspandtrust-debug, so fresh installs can use offline Devices & Connections configuration without requiring a separate runtime binary onPATH. - trust-runtime: Network Canvas communication setup now labels the ADS client
timing knob as an ADS link update interval instead of the internal "worker
tick" term, and offline fleet topology now uses the OS hostname before
falling back to
local-host. - trust-runtime: ADS live symbol browsing and exact-tag import now treat
symbol-upload no-reply/timeouts after a stale route check as structured
route.status = "missing"responses with anads.route_plan, so the Network Canvas can show "Create route" instead of a raw ADS timeout when the TwinCAT return AMS route is missing. - trust-runtime:
comm.schemanow advertises the implemented Discover/Browse actions for EtherCAT, GPIO, OPC UA expose, and ADS-server expose workflows, andcomm.applynow bootstraps Network Canvas I/O edits from single-driver, empty, or comment-onlyio.tomlfiles by writing the canonical multi-driver form instead of blocking on setup placeholder files. - trust-runtime: HMI persistence reload now parses persisted JSONL trend/alarm records through a tolerant record reader, avoiding a deterministic reload failure observed in the full remote runtime gate while preserving the stored wire format.
- trust-debug: attach-mode I/O forcing now forwards VS Code Force/Release
actions to remote runtimes through
io.forceandio.unforce, and runtime controlio.readnow marks forced rows so Live Values can show real remote force state instead of disabling the workflow. - trust-debug: debug-launched local simulator control servers now receive the
launch project root, letting
comm.applycreate or update the project'sio.tomlinstead of failing Network Canvas easy-setup with "No runtime project root is available for io.toml setup." - trust-runtime: ADS server UDP identify now listens on a wildcard UDP socket while advertising the configured concrete runtime identity, so TwinCAT Broadcast Search can reach truST instead of requiring directed identify or static route-file setup.
- trust-runtime: ADS server UDP discovery now acknowledges TwinCAT Broadcast
Search Add Route requests while keeping actual ADS access gated by the
source-pinned
[runtime.ads_server.clients]allowlist. - trust-runtime: ADS server value reads now zero-pad shorter scalar payloads to the requested read length and accept TwinCAT's zero-payload handle release form, matching TwinCAT symbolic FB expectations without changing symbol-upload or datatype-table response lengths.
- trust-runtime: ADS server subscriptions now accept Beckhoff ADS.NET 7 compact
AddDeviceNotificationregistrations, normalize Beckhoff's 100 ns notification cycle/max-delay values to server milliseconds, and retain the registering ADS port per notification so TwinCAT/ADS.NET router-multiplexed clients receive changed-value notifications. - trust-runtime: ADS server
SYM_UPLOADINFO2responses now zero-pad to the requested read length, matching ADS clients such asads-rsthat read the 24-byte upload-info structure through a larger fixed buffer. - trust-runtime: ADS server
GET_SYMINFO_BYNAMEnow returns the compact index-group/index-offset/byte-size tuple expected by ADS clients such asads-rs, whileGET_SYMINFO_BYNAMEEXcontinues to return the full symbol entry used by browsing clients. - trust-runtime: ADS server now handles
SUMUP_READ_EXbatch reads with per-item result-length metadata, matching the batch-read form used by theads-rsclient backend. - trust-runtime: ADS client
read_writebindings now seed their output-change baseline from the first good remote read, preventing local cold-start default values from being written back before the PLC value has been applied. - trust-runtime: ADS guarded write probes now wait for scan-boundary write application before read-back comparison, avoiding false mismatches against scan-applied ADS servers.
- trust-hir/trust-ide: IEC Table 39 validation functions
IS_VALIDandIS_VALID_BCDnow type-check and surface in editor completion, hover, and signature help;IS_VALID_BCDacceptsBYTE/WORD/DWORD/LWORDand rejectsBOOL. - trust-runtime:
IS_VALID_BCDnow rejectsBOOL, and runtime bytecode now supports Table 17 partial read/write through properly mapped structuredVAR_IN_OUTreferences. - Runtime bytecode execution now supports IEC Table 17 partial
bit/byte/word/dword access on
BYTE,WORD,DWORD, andLWORDfunction-block instance fields, matching the existing program-variable behavior. architecture-doctor --changednow follows the currentcrates/trust-runtime/src/host/...runtime host layout for initializer and evaluation checks.- Runtime I/O drivers now fail closed for the covered safety paths: MQTT disconnected/stale reads and publish/connect failures return structured runtime errors, EtherCAT discovery and image-size mismatches fault under every policy, Modbus flush/transport failures and Modbus exceptions remain distinguishable, and GPIO read/write failures are reflected in driver health.
- Retain persistence now writes through a temp file, flush/fsync, atomic rename, and parent directory sync, and retain snapshots now use a length-delimited CRC/trailer-protected codec with legacy v1 read support plus explicit retain migration/orphan events.
- Runtime initialization, evaluator assignments, and queued debug writes now
fail closed for the covered safety paths: default materialization failures
return
InitFailedinstead of becomingNULL, undefined evaluator/debug targets are rejected instead of creating globals, and queued debug write failures fault the cycle visibly. - Interface-typed runtime variables now materialize as explicit
NULLreferences during default initialization, and genericANY_INTcounter slots defer to the call argument type instead of failing runtime startup. - Runtime bytecode lowering now materializes HIR-allowed contextual widening at assignment boundaries using the target runtime type, with proof coverage for function inputs/outputs, assignments, initializers, return values, InOut rejection, and narrowing rejection.
- Runtime audit/event, mesh, debug, and runtime-cloud safety paths now fail
closed for the covered cases: closed audit sinks emit
AuditDropped, closed debug event/log streams fall back to in-memory buffers, mesh snapshot timeouts are errors instead of empty maps, corrupt runtime-cloud config state becomes an explicit error state, corrupt link/rollout state prevents web startup, and disabled debug-control requests return structuredfeature_disabled. FULLMAP-RUNTIMESAFEnow runs as a blocking architecture-doctor/CI gate with zero findings and zero allowlist entries.- Harness boundary inputs now fail closed: typoed
set_inputnames andbind_directtargets return structured boundary errors instead of creating hidden globals or undeclared I/O bindings. CONFIGURATIONbuilds now reject declared top-levelPROGRAMs that are not bound by the configuration, unless a test builder explicitly opts in through extra program instances.- MQTT
keep_alive_sis now applied to therumqttcsession options instead of being parsed only at validation time. - MQTT TLS fixture paths are normalized before being embedded in TOML so the TLS config tests run on Windows paths as well as Unix paths.
- Dependency hygiene now has explicit
cargo deny,cargo audit, andcargo machetepolicy evidence: unused direct workspace dependencies were removed, the workspace MSRV was raised from Rust1.85to Rust1.95,timewas updated to the patched0.3.47,ratatuiwas updated to0.30,rumqttcno longer enables unused default TLS dependencies,qrcodeno longer pulls its unused image backend, the optionalopcua-wireadvisory paths are documented with owner/rationale/removal metadata,Cargo.lockis tracked for reproducible CI dependency resolution, runtime modulo checks now use the Rust1.95is_multiple_ofAPI so Clippy stays clean on the new MSRV,third_party/tiverse-mmapis an intentional workspace exclude, and the full-map doctor reports the dependency hygiene status with failing policy fixtures. - External safety follow-up now prunes the Zenoh default-feature dependency
surface to remove the transitive
rsaadvisory path, removes directrustls-pemfileuse from runtime TLS PEM parsing, refreshes ownedcargo denyadvisory metadata for the remaining OPC UA, tiny_http TLS, and Zenohpastepaths, and records the remaining external unsafe-scanner gap in the architecture follow-up checklist. - Parser recovery for malformed aggregate/positional initializers is now bounded by shared top-level scan helpers, preserves following declarations at declaration boundaries, and is guarded by full-map doctor and focused mutation evidence.
- HIR validation now rejects non-repeat call expressions used as array defaults and validates direct array repetition defaults against the repeated element type, closing focused mutation-testing gaps in default initializer analysis.
- Runtime and constant-expression array repetition initializers now shape arrays
from the expanded value count, so declarations such as
[3(1, 2)]materialize as six elements instead of failing type validation as a one-element array. - Bytecode validation now rejects duplicate
POU_INDEXids and unsupported runtime-only opcodes before VM module construction/dispatch instead of silently allowing map overwrites or late runtime traps. - VM instance-owner inference now scans partial-access opcodes with their correct operand width, avoiding a silent owner-context drop in bytecode that mixes instance references with bit/byte/word/dword access.
- Bytecode validation now rejects POU bytecode that uses a local reference outside that POU's declared local-ref range, so malformed local slots fail before VM frame execution, while still accepting owned derived local path references such as local array elements and struct fields.
- HIR validation now reports
UndefinedVariablewhen aVAR_ACCESSaccess path points at a missing target instead of silently accepting the declaration. - HIR constant evaluation now reports
CannotResolvefor ambiguous unqualified enum value names instead of picking the first matching enum member from the symbol table. - HIR alias resolution no longer silently stops after sixteen alias hops, so deep but valid alias chains resolve to their base type.
- HIR call checking now reports
UndefinedFunctionwhen a resolved field or non-callable expression is used as a callee instead of silently returning an unknown type. - HIR global symbol lookup now uses the same first-writer collision policy for normal collector inserts and raw/import inserts, avoiding order-dependent duplicate-name lookup drift.
- Project source registration now rejects explicit
FileIdcollisions instead of silently reallocating a different file identity. - HIR type-check context construction now classifies missing POU owners/scopes
and reports
CannotResolveinstead of silently falling back to global scope. - HIR OOP diagnostics now use a shared extends-chain walker so mixed function-block/class inheritance cycles cannot bypass cycle detection.
- HIR diagnostics now distinguish existing symbols used in the wrong semantic role: values used as types, types used as values, and callables used as variables report primary wrong-kind diagnostics instead of silent unknowns or wrong-reason undefined diagnostics.
- HIR expression checking now applies the same wrong-kind diagnostics to namespace-qualified project imports, so imported types used as values no longer type-check silently through field-expression resolution.
- HIR/parser name handling now treats
GETandSETas contextual names in method/member expression positions, so methods such asGet()can be collected, type checked, and called without fallback to global scope. - HIR expression inference now suppresses numeric/bit/unary/index/dereference
and
__DELETEfollow-on type errors when an operand or indexed base already has a primary unresolved-name diagnostic. - HIR validation now reports unresolved or malformed
VAR_CONFIGtargets explicitly instead of letting invalid configuration entries disappear during collection/validation. - Cross-project HIR symbol imports now report duplicate imported global names instead of silently keeping the first imported binding.
- Cross-project HIR type imports now report cyclic aliases with
CyclicDependencyand avoid degrading the cycle into silent unknown-type suppression. - HIR type checking now reports constant-evaluation failures at array bounds,
subrange assignments, CASE label duplicate tracking, and
SIZEOFtype operands instead of collapsingConstEvalErrorintoNone. - HIR assignment compatibility no longer substitutes missing array element or
pointer target
TypeIds withType::Unknown, preventing malformed type identities from being accepted as compatible. - HIR typed literals now report
UndefinedTypewhen their type prefix cannot be resolved instead of silently inferring an unknown expression type. - Project source registration now preserves noncanonical fallback paths when OS canonicalization fails, preventing lexical paths from silently colliding with existing canonical source keys.
- HIR OOP
EXTENDS/IMPLEMENTSresolution no longer treats a missing owner scope as global scope when resolving inherited or implemented types. - HIR interface conformance now resolves inherited interface members through the owner's namespace scope instead of falling back to a global bare name.
- HIR call inference now preserves ambiguous
USINGresolution as the primaryCannotResolvediagnostic instead of adding a wrongUndefinedFunction. - HIR value/type expression inference now preserves ambiguous
USINGresolution as the primaryCannotResolvediagnostic for value reads, assignment targets,SIZEOF, andNEWtype operands instead of degrading into wrong-reason undefined diagnostics. - HIR standard function type checking now suppresses wrong-reason argument diagnostics when an argument already has a primary unresolved-name diagnostic.
- HIR diagnostics now deduplicate exact duplicate diagnostics by full diagnostic identity, preventing repeated semantic probes from reporting the same primary error multiple times while preserving distinct diagnostics.
- HIR
SymbolTablebroad lookup helpers are no longer public API; external callers now use explicit global, qualified-name, or registered-type lookup contracts. - HIR constant precollection now keys constants by full namespace/POU scope identity, so same-named POUs in different namespaces cannot share local constant values for array, subrange, or string bounds.
- HIR
VAR_CONFIGvalidation now treats duplicate bare program instance names across resources as ambiguous and reportsCannotResolveinstead of choosing one instance and emitting follow-on type/address diagnostics. - HIR member and compatibility resolution for raw
EXTENDS/IMPLEMENTSreferences now resolves bare base/interface names from the owning POU scope instead of falling back to a global bare-name lookup. - HIR analysis now exposes a declaration catalog with qualified names, source identity, semantic roles, project-import origin, translated type identities, and classified OOP reference outcomes; runtime POU registration is driven by that catalog and reports catalog/lowering mismatches instead of silently skipping accepted declarations.
- VS Code activation no longer writes the default runtime control endpoint into workspace folder settings; runtime panels still use the built-in endpoint fallback when the setting is empty.
Pt1Filter.Reset()now reinitializes the underlying OSCATFT_PT1state on the next update, andHysteresisSwitch.Reset()now resets the actual hysteresis state instead of only clearing cached wrapper fields.UnitConverternow delegates Celsius/Kelvin and energy/calorie conversions to classic OSCAT functions/function blocks so the component facade cannot silently diverge from the parity oracle.- OSCAT OOP tests now cover reset behavior, multi-scan PT1 parity,
invalid limit rejection, FIFO ordering, and the OSCAT version through
OSCAT_VERSION(IN := FALSE)instead of a hardcoded value. - Public docs links for PLCopen/Oscat example READMEs now resolve under MkDocs strict mode.
- Runtime compilation now registers namespaced
PROGRAMdeclarations and resolves sibling namespace types for local OOPIMPLEMENTSchecks, so namespaced runtime programs and same-namespace interfaces are handled consistently with functions, function blocks, classes, and type declarations. - Runtime bytecode generation now preserves POU namespace context for sibling function calls, keeps method names owner-local inside namespaced class-like POUs, and exposes bare return-variable aliases for namespaced functions.
Added¶
- Structured Text initializers now support named aggregate defaults for
STRUCT/UNIONvalues at VAR, TYPE, and member-default sites, route those defaults through a runtime initializer service, validate unknown/duplicate fields with stable diagnostics, allow legal function-block member overrides, and exposetrust-runtime bench initfor startup/first-cycle initialization benchmark evidence. - PLCopen Motion now ships a second, object-oriented package at
libraries/plcopen_motion/oop, with ST interfaces and concrete objects foritfAxis, command objects, andMC_OopAxis. The package delegates axis behavior to the classic single-axis PLCopen package, includes deterministic unsupported command-object returns for unimplemented OOP methods, and is covered by Structured Text unit tests plus runtime integration drivers. - The public docs now include a PLCopen Motion OOP library guide and five runnable real-world examples: warehouse shuttle, labeling conveyor, pick-and-place lift, indexing table, and feeder axis.
- OSCAT now ships an object-oriented Components companion package at
libraries/oscat/oop, with narrow interfaces for automation context, unit conversion, filtering, PI/PID/PWM control, hysteresis switching, signal generation, FIFO/stack memory objects, latches/toggles/counters, measuring components, calendar/RTC helpers, selected building-control objects, and a single-output device driver. The package is covered by Structured Text parity tests against classic OSCAT. -
The OSCAT OOP example suite now includes 49 classic/OOP comparison pairs under
examples/OSCAT/<example>/{non-oop,oop}: 27 hand-written process-first industrial pattern scenarios, 20 compact component-composition showcases, and 2 compact pattern showcases. Each example folder has one teaching README explaining the process, the OOP pattern, why it helps, how to reuse it, and when classic ST is better. Each project has Structured Text application code and Structured Text unit tests; OOP projects with communication claims include runtime/IO configuration and README integration maps naming%I/%Qbindings and exposed runtime records. A Rust catalog gate now runs every project and checks that the claimed OOP pattern is present insrc/Main.st, covering Factory, Template Method, Strategy, Mediator, Observer, Composite, Iterator-style traversal, Decorator, Facade, Chain of Responsibility, State, Command/Memento, Adapter, Proxy, polymorphism, and composition. Public docs include a library guide plus the new truST Structured Text naming standard. -
The public docs now include a
One Project, Every Surfaceconcept page that positions VS Code, Editor AI tools, Browser IDE, Browser HMI, CLI/CI, Agent API, LSP editors, and truST Mesh as live surfaces over the same project, with an honest surface capability matrix and AI tooling evidence links. The docs homepage, README, workflow chooser, visual-editor docs, and migration path now point into the same narrative, and the README/homepage use a new one-project surface-tour GIF built from real product captures. Migration ecosystem pages now have canonicalmigrate/*URLs, visual-editor pages avoid misleading empty captures by using accurate diagrams, and project/support pages stay outside the lookup-only Reference route. A full public-doc text pass also removed thin wrapper prose, separated HMI authoring from HMI operation, routed Learning Paths into Program, clarified Troubleshooting vs FAQ, expanded First Project into a real walkthrough, added jargon notes to concept pages, tightened the homepage around one route table plus real product proof, added richer example/category routing, kept AI Assistance grounded in diagram/source evidence, added first-figure proof PNGs for the operator HMI overview, daily-check, alarm, and handover pages, and tightened README platform/status wording including Linux PREEMPT_RT support. The public docs nav has since been collapsed to six user-facing doors (What Is truST?,Install,Program,Run,Hardware,Reference), with tutorials/examples, communication, I/O, HMI authoring, migration, automation, and AI work routed throughProgram; OpenPLC is no longer presented as a standalone truST workflow; dense terms blocks and stock "use this guide when" boilerplate were removed; and the one-project GIF was regenerated at higher resolution without the dark banner overlay. -
trust-runtime plcopennow imports official TC6 XML multi-worksheet ST bodies in execution order, reconstructs all standard POU interface var sections (VAR,VAR_TEMP,VAR_INPUT,VAR_OUTPUT,VAR_IN_OUT,VAR_EXTERNAL,VAR_GLOBAL,VAR_ACCESS), and round-trips CODESYSaddData/methodmetadata forFUNCTION_BLOCKmethods with deterministic method object IDs/project-structure placement. -
trust-runtimenow supports a Linuxruntime.realtimestartup profile forPREEMPT_RTposture, including config-schema support, bundle-template defaults, launcher-side kernel/scheduler/affinity/memory-lock verification, richer runtime status/config surfaces, application-level cyclep50/p95/p99metrics, a dedicated operator deployment guide, a referencesystemdunit template, and a shipped validation script for collecting host/kernel/service evidence alongside release-mode benchmark artifacts. - The public docs now have a workflow-first entry model instead of a mixed
"one start flow for everyone" structure. Home and Start now route five real
user journeys directly: Program in VS Code, Program in Browser IDE, Operate
in Browser HMI, Automate with CLI / CI / agents, and Maintain an Existing
Project. The site now also includes public
About,FAQ,Contribute,Version History,Hardware Compatibility,API Lifecycle And Deprecation, runbook/operator pages, target-host lifecycle pages, and enterprise-integration routing pages so technicians, maintainers, and GitHub visitors can find the right docs path without repo spelunking. - The docs homepage and repo README now surface the published docs site as the primary entry point, use the truST logo directly, and show real browser captures for Browser IDE and Browser HMI instead of forcing readers through repo file paths or VS Code-only framing.
trust-runtime agent servenow provides an initial external agent surface over stdio JSON-RPC withagent.describe,workspace.read,workspace.write,workspace.project_info,lsp.diagnostics,lsp.format,runtime.build,runtime.compile_reload,runtime.validate,runtime.test,runtime.reload,harness.load,harness.reload,harness.cycle,harness.set_input,harness.get_output,harness.advance_time, andharness.run_until, plus stable error codes for unknown methods, workspace-path escapes, harness state, and boundedrun_untiltimeouts. The runtime-facing methods now reuse the existingbuild --ci,validate --ci, JSON test-output path, in-process Web IDE diagnostics/formatting services, and control-serverbytecode.reloadcontract instead of inventing a second reporting surface.trust-runtime agent serve runtime.compile_reloadnow returns one machine-readable payload fordiagnose -> build -> reload, including diagnostics counts/issues plusruntimeStatus/runtimeMessageand the optional nested build/reload results needed for iterative repair loops.trust-runtime agent servenow exposeslsp.ast_canonicalizeandlsp.ast_similarityfor the canonical-AST 5-gram normalization path used by benchmark contamination checks, dedup, and self-improvement diversity gates. The existinglsp.diagnosticspayload now also includes end positions and zero-based UTF-8 byte spans, so benchmark/datagen tooling can consume stable machine-readable diagnostics without brittle text scraping.trust-runtime agent servenow also exposes a statelessharness.executefixture wrapper that loads project or inline sources, runs deterministic harness steps, evaluates output/access/direct-I/O assertions, and returns a compact pass/fail report with reduced failure context for benchmark/datagen callers that need one-shot POU or system-fixture execution.trust-runtime agent serve workspace.project_infonow returns a stable orientation payload for agents, including resolved source roots, source files, local dependency roots, runtime/io config presence, parsed runtime control/web/mesh/discovery summary fields, andtrust-lsp.tomlvendor_profilewhen present.trust-runtimenow lowers STPROPERTYimplementations into runtime getter and setter calls, so OOP interface references can dispatch property reads and assignments across source files and package dependencies.trust-harnessis now a real programmable deterministic executor instead of a minimalload/cyclehelper. It now supportsreload,set_input,get_output,set_access,get_access,bind_direct,set_direct_input,get_direct_output,advance_time,run_until,restart, andsnapshot, all over structured JSON-lines with shared typed IEC value encoding and protocol docs indocs/guides/TRUST_HARNESS_PROTOCOL.md.- A canonical public docs site now lives under
docs/public/with question- driven navigation (start,develop,connect,operate,reference,concepts,examples), a MkDocs + Material site config at repo root, a Pages workflow that builds and deploys the docs site, and a public-doc link checker inscripts/check_public_docs_links.py. - The runnable examples catalog is now aligned to the docs IA instead of
acting like one flat dump:
examples/README.mdnow routes by docs category,docs/internal/testing/checklists/example-catalog-audit.mdrecords keep / tweak / merge / archive decisions,examples/sfc/README.mdandexamples/web_ui_complete_project/README.mdwere added, andexamples/simulate_process/README.mdnow marks that family as archive- candidate rather than a first-stop public example. Kept public examples now also link back to their owning docs category, andscripts/check_example_catalog_links.pyenforces that the curated docs catalog points to real runnable example paths. - The public docs are now materially self-contained instead of mostly wrapper pages: editor selection, protocol matrices, runtime-to-runtime transports, visual-editor guidance, runtime control/debug/operator docs, benchmark reference, vendor-profile example routing, and key protocol pages now render substantive in-site content instead of punting readers to raw GitHub pages.
- Public-doc media is now generated through an explicit pipeline:
scripts/capture-public-docs-visual-editors.shcaptures the visual-editor screenshots automatically,scripts/generate_public_docs_media.pysyncs them intodocs/public/assets/images/, and the Pages workflow now rebuilds when those source screenshots or media-generation scripts change. - The docs Pages workflow now has stricter quality gates: local search regression checks, post-deploy verification of the published site, and automated media synchronization all run as part of the docs build path.
- The public docs now cover more real operator/agent search paths directly in
CI, including
scan cycle,project layout,visual editor,vendor profile,watchdog,fault policy,agent serve,hot reload, and test output format queries, so discoverability regressions are caught earlier. - Public-doc screenshots now have a first automated browser-capture lane:
Playwright regenerates checked-in
/ideand/hmiassets against live truST surfaces, code-server provides a truthful VS Code-compatible proof capture for the public docs,docs/public/assets/capture-inventory.jsonrecords the checked-in completeness contract, and a dedicated docs-captures workflow can refresh those assets onmainand nightly without relying onydotoold. - Public-doc terminal captures now have a first automated lane as well: VHS tapes regenerate checked-in CLI verification GIFs for installation and build/validate/test docs, and the same docs-captures workflow refreshes those assets alongside the browser/code-server captures.
- The public docs now include a dedicated diagnostics reference page covering
current
E...,W..., andI...codes, their default severities, meanings, and first-fix guidance, and docs-search regression coverage now includes code queries such asE001,W003,implicit conversion, andmissing else.
Fixed¶
- Enum values loaded from
VARinitializers now compare equal to the same enum variant literal in VM execution, covering unqualified, qualified, and literal-on-left equality checks for init-only state-machine selectors. Runtime enum construction now canonicalizes alias-backed enum values and retained enum state before comparison, preventing stale or case-variant type names from silently turning valid enum equality checks intoFALSE. Runtime compound values now also validate struct field identity and array shape at construction and retain-apply boundaries, so corrupted retained structs or arrays fail with diagnostics instead of being silently coerced or defaulted. - Runtime ST test compilation now reuses expression type information from the HIR analysis pass, avoids repeated full-project symbol-table clones during lowering, and skips shared-global task-hazard scans when a project has no configured tasks. This keeps the full OSCAT timeout regression below the test harness 60-second warning while preserving the runtime timeout budget.
- Public docs IA now removes the duplicate Install/Verify Install route, keeps Reference focused on lookup material by moving specifications higher and hiding contributor-only pages, deletes dead interoperability stubs and orphan/broken image assets, embeds the real one-project surface tour on the docs homepage, and expands the IA checker to block generic filler phrases such as "use this page", "after reading", and "you should be able".
- Public docs visual chrome now uses a dark/light palette toggle, top-level navigation tabs for the six main doors, a shorter GitHub repo label, a distinct accent color, Inter/JetBrains Mono typography, and image overflow safeguards so screenshots stay inside the content column. The docs homepage also switches to a dark-mode wordmark variant so the brand stays legible on the slate palette.
- Public docs navigation now exposes the PREEMPT_RT runbook from the Operate sidebar, reuses the interoperability pages under Migrate without moving their canonical URLs, groups Operate by engineering, target-administration, operator/technician, and fleet-delivery personas, surfaces truST Mesh from Connect, links README start paths directly, and avoids confirmed snippet/list-rendering issues in included public documentation. Concept, Reference, Specifications, and Examples indexes now use clearer task and mental-model groupings, the docs maintenance guide codifies nav, snippet, visual, verification, and proof rules, the SFC profile reference now uses a non-numbered slug to avoid a spec-14 collision, visual-editor and operator pages now include public visuals, the Migrate page includes a compatibility matrix, and the example catalog audit understands PyMdown line-range snippet targets used to skip included page titles. A new docs IA lint now enforces section-index/nav coverage, snippet H1 safety, and CommonMark list spacing, and the internal docs checklist records analytics, versioning, success-metric, accessibility, and mobile-review decisions.
- The shipped
examples/oscat_smokeconsumer now matches the current OSCAT named-parameter surface (DEG,DAYS, andDATA), so the example builds cleanly again instead of failing on staleD := ...calls. trust-lsppush-diagnostics mode now refreshes dependent open documents afterdidOpen,didChange, anddidSaveevents, so cross-file call diagnostics clear and update immediately instead of staying stale until a reopen/save cycle.-
Method-call completion and signature help now resolve
FUNCTION_BLOCKmethods withVAR_INPUTparameters correctly, so formal parameter names are offered forfb.Method(...)calls instead of falling back to the owning instance call shape. -
Linux
PREEMPT_RTsupport no longer breaks non-Linux cargo builds and warning gates: Linux-only helpers/imports intrust-runtimeare now target-scoped so macOS and Windows builds keep compiling cleanly while the RT posture feature remains Linux-only. - The Linux cyclic runtime no longer rebuilds ready-task and background-program
scratch vectors every scan cycle; those scratch buffers are now runtime-owned
and reused so the
PREEMPT_RTpath reduces avoidable hot-path allocation churn while preserving existing Linux behavior. - Linux
PREEMPT_RTposture verification now reads the scheduler thread's user-space realtime priority from/proc/thread-self/statinstead of the kernel-internal/proc/.../schedpriority field, so correctly-configuredSCHED_FIFO/SCHED_RRdeployments no longer report false priority mismatches. The shipped validation script now also exposes whether a target threshold was declared, records the approximate soak window, warns when aPREEMPT_RTrun falls back to the cycle budget, and fails gated RT evidence runs whencyclictestor an explicitTRUST_RT_CYCLE_P95_MAX_USthreshold is missing. - The public docs and repo landing surfaces now lead with the strongest truST
story instead of burying it behind browser-first proof shots: the homepage,
Program In VS Code,Debugging And Runtime Panel, andREADME.mdnow show real desktop VS Code screenshots for the runtime panel, IEC-aware diagnostics, paused debugging, and cross-file rename, while browser IDE/HMI surfaces are clearly presented as supporting views of the same project. - The docs site now ships the truST wordmark, a dedicated favicon, and a teal Material theme instead of the default MkDocs branding, and the public pages were rewritten to remove boilerplate "use this page when..." framing and similar filler so the rendered docs read as product documentation instead of internal notes.
- The public docs landing/start/reference/operator pages now describe truST in direct product language, ship real social metadata for sharing, and replace thin operator checklists with concrete tables, screenshots, and escalation placeholders instead of stub prose.
- The checked-in Browser IDE and code-server public-doc captures now prove a
successful truST state more clearly:
/idewaits for a real build to finish before capture, and the VS Code-compatible proof opens the Structured Text Runtime panel instead of showing only a generic workspace shell. - The docs search regression gate now routes
install mac,first project,ladder, andretainqueries back to the intended public docs pages after the docs IA/spec split, including a restoredStart -> First Projectpage and stronger canonical ranking forruntime.tomlretain/watchdog/fault queries. - The docs-capture code-server launcher now keeps mutable user-data and
extension state inside container-local writable directories, avoiding the
GitHub Actions permission failure that previously blocked the code-server
capture lane on repo-mounted
.cachepaths. - The public docs Pages pipeline no longer hard-fails on runners without
ffmpegwhen all committed screenshot assets are already present, and the cross-platformtrust-runtime agent servecontract tests now normalize OS-specific path spellings (/privatealiases,\\?\\prefixes, native separators) instead of failing on macOS/Windows-only path formatting differences. -
Warm restart and live
bytecode.reloadnow preserve compiled instance-backed runtime references across the restart boundary, so instance-backed I/O bindings and the newtrust-runtime agent serveruntime.reloadflow no longer tripnull reference dereferencefaults immediately after a reload. -
VS Code language-model tool discovery is now consistent again: the extension registers the same linked-editing, on-type-formatting, call-hierarchy, and type-hierarchy tool names that
editors/vscode/package.jsondeclares and activates, and the extension test suite now fails if manifest declarations, activation events, andlm.registerTool(...)registrations drift apart. - The public docs workflow now rebuilds on guide/spec/conformance/media-source
edits instead of only direct
docs/public/**changes, closing the stale-site gap for--8<---included content and generated public assets. - The code-server screenshot lane now waits for real editor content instead of
only a tab label, dismisses first-run/sign-in chrome, closes the unrelated
chat side panel before capture, and renames the Browser IDE screenshot to the
truthful "tutorial loaded" state instead of implying a welcome screen that
was not what the image actually showed. The installation docs also no longer
tell users to run the nonexistent
cargo build -p trust-harnesspackage command; they now document the real package/build surface. - The automated public-doc capture lanes now produce stable dark-mode browser
and code-server screenshots from real app/theme controls, wait for the HMI
schema/export surface before capturing
/hmi, and install/load the truST VS Code extension through one consistent code-server profile so the command-palette capture stops regressing on fresh CI boots. - Unqualified enum variant names now also resolve in three contexts outside
CASElabels:VARinitializers (state : Phase := IDLE), the right-hand side of assignments (state := RUNNING), and operands of binary comparisons (IF state = RUNNING THEN ...). Before this change the first form failed PROGRAM init withundefined variable 'IDLE', and the other two compiled but silently lowered the bare variant name as an unresolvedExpr::Name, so the target either kept its previous value or the comparison never matched at runtime. The fix introduces a small harness-lowering helper next to the existingenum_literal_valueused byCASElabels and applies it at the VAR-declaration, assignment, and binary-expression call sites, mirroring the pattern introduced by the unqualified-CASE-label fix. HIR type-check was already accepting all three forms, so this is a lowering-layer alignment only; bare names still follow normal symbol resolution, which means local variables/constants continue to shadow same-named enum members, and qualifiedPhase#Xforms plusCASElabels behave as before. - The ST compiler/runtime build path now closes the remaining open regression
cases around control-flow and declaration lowering: unqualified enum members
now work as
CASElabels in end-to-end runtime/bytecode builds, aggregate array declaration initializers now parse and execute for explicit, partial, and repetition-count forms, struct-field access through indexed arrays stays buildable on the CLI path, and bareRETURN;now works after assigning the implicit function/method result on that path because the HIR checker tracks definite assignment and the bytecode VM lowersRETURNinstead of rejecting it as a legacy C5 edge case. - The OSCAT runtime/compiler path now handles the full shipped OSCAT library
more reliably: bytecode lowering resolves local instance names before global
callable symbols, normalizes OSCAT-style identifier lookup consistently
across locals/reference lowering, and fixes remaining Chapter 19/20/23/24
regressions such as
AOUT/AOUT1scaling,MULTI_INmode0,ACTUATOR_COIL,CTRL_IN,HYST*,PARSET/PARSET2, and first-scanTEMP_EXTsampling. The full OSCAT core fixture now runs green again. - Runtime VM string access, native-call dispatch, and hot-path execution are
now more consistent and predictable: signed unary
NEGon minimum signed integers now reports overflow instead of panicking/wrapping, pure-DINTMOD 0now matches the genericModuloByZerocontract, array offset math and runtime date construction reject invalid edge cases deterministically, runtimeSTRING/WSTRINGindexing and string stdlib helpers now follow a single documented element contract for non-ASCII text,CALL_NATIVEnow caches statically resolvable function targets instead of uppercasing and hashing every call, and the VM hot path now reuses register frame buffers, drops redundant register-file zeroing, batches stack deadline checks, and avoids cloning the debug hook on each statement. The release benchmark path also restores the earlier VM latency envelope by caching per-POU local-init plans and trimming dynamic-ref hot-path overhead instead of rebuilding that work every scan. - The OSCAT BASIC
CALENDARport keeps truST strict about IEC reserved keywords instead of relaxing the parser, so the shipped Chapter 3 data type exposes compliant local-time field namesLOCAL_DT,LOCAL_DATE, andLOCAL_TODin place of upstreamLDT,LDATE, andLTOD. trust-hirnow resolves cross-file user-defined types for rootVAR_GLOBALdeclarations during project-aware symbol collection instead of depending on a late repair pass, so split projects like OSCAT BASIC can keep shared carrier types in one file/chapter and their globals in another while diagnostics, analysis, runtime builds, and VM execution still resolveMATH/PHYS/LANGUAGEcorrectly. The same project-type catalog path now also preserves imported function block/class/interface identity, honorsUSING+ namespaced simple type references, and attaches every declaration inside multi-entryTYPE ... END_TYPEblocks so cross-file POU member access surfaces likeFB_Accumulator,ST_PumpCommand, andST_PumpStatusanalyze correctly.- Typed conversion calls no longer misclassify an outer positional argument as a named/formal argument when the nested inner call uses
IN := ..., so expressions likeUDINT_TO_REAL(DWORD_TO_UDINT(IN := x))type-check correctly again. SIZEOF(...)now resolves the static type of an explicit type name or storage operand (var, field/index access, dereference,THIS.field) during analysis/lowering instead of evaluating a runtime value, soSIZEOF(var)now works in normal expressions and constant contexts likeARRAY[0..SIZEOF(packet)-1], bare-name lookup follows CODESYS-style variable-before-type shadowing even when a top-level type shares the same bare name, pointer/reference operands now report and const-fold to platform pointer word size instead of truST's internal handle layout, and invalid forms such asSIZEOF(call), arithmetic expressions, open arrays, unsized strings, and whole FB/class/interface instances fail deterministically during build instead of lowering to the legacySIZEOF_VALUEpath.
Added¶
libraries/oscatnow ships the full manual-aligned OSCAT chapter set (03_data_typesthrough26_list_processing) as the primary OSCAT package, including the OSCAT_BUILDING Chapter 23 control/environmental surface, a full ST conformance project underfixtures/oscat/corethat now passes126tests with0failures and0errors, plus a narrowednegative_public_surfacesentinel that exists only to pin the deliberate upstreamOVERRIDE-> truSTOVERRIDE_3name deviation.- The OSCAT user documentation now matches the library’s current shipped
surface:
docs/guides/OSCAT_LIBRARY_GUIDE.md,libraries/oscat/README.md,docs/README.md, andexamples/oscat_smoke/README.mdnow describe the full package layout, validation evidence, public carrier/data-type surface, and the major function-block families instead of the earlier smaller OSCAT BASIC slice. libraries/oscatnow also ships the full Chapter 6Arrayssurface:_ARRAY_ABS,_ARRAY_ADD,_ARRAY_INIT,_ARRAY_MEDIAN,_ARRAY_MUL,_ARRAY_SHUFFLE,_ARRAY_SORT,ARRAY_AVG,ARRAY_GAV,ARRAY_HAV,ARRAY_MAX,ARRAY_MIN,ARRAY_SDV,ARRAY_SPR,ARRAY_SUM,ARRAY_TREND,ARRAY_VAR, andIS_SORTED.libraries/oscatnow also ships the full Chapter 4Other Functionsslice:STATUS_TO_ESR,OSCAT_VERSION,ESR_COLLECT,ESR_MON_B8,ESR_MON_R4, andESR_MON_X8.libraries/oscatnow also ships the full Chapter 5Mathematicssurface, including the remaining error/distribution helpers (ERF,ERFC,GAUSS,GAUSSCD), integer/sequence/fraction helpers (EXPN,FACT,FIB,GCD,REAL_TO_FRAC), transcendental helpers (GDF,GOLD,LAMBERT_W,LANGEVIN,SIGMOID,SINC,SQRTN,TANC), rounding and window helpers (RND,ROUND,WINDOW,WINDOW2), and the OSCAT random helpers (RDM,RDM2,RDMDW).libraries/oscatnow also ships the first Chapter 3 data-type slice:CALENDAR,COMPLEX,CONSTANTS_LOCATION,CONSTANTS_SETUP,ESR_DATA,FRACTION,HOLIDAY_DATA,REAL2,SDT,TIMER_EVENT, andVECTOR_3, plus the preloadedMATH.FACTS[...]factorial table used by later OSCAT helpers.libraries/oscatnow also ships the stateful helper function blocksDELAYandFT_AVG.libraries/oscatnow also ships the first linear/polynomial/ramp math helpers:F_LIN,F_LIN2,F_POLY,F_POWER,F_QUAD, andFRMP_B.- Added the first shipped
libraries/oscatpackage with the initial OSCAT compatibility slice (shared math/physics constants plus core conversion helpers), alongsideexamples/oscat_smokeas the first consumer project wired through[dependencies]. - Added OSCAT compatibility extensions
TIME_TO_DWORD,DWORD_TO_TIME,T_PLC_MS, andT_PLC_US, plus restoredDIR_TO_DEG,F_TO_PT,PT_TO_F, and the liveLANGUAGE.DIRS[...]surface inlibraries/oscat. libraries/oscatnow also ships a larger date/time slice includingDAY_TO_TIME,HOUR_TO_TIME,MINUTE_TO_TIME,SECOND_TO_TIME,DAY_OF_DATE,DAYS_DELTA,DAYS_IN_MONTH,DAYS_IN_YEAR,DATE_ADD,EASTER,WORK_WEEK,HOUR_OF_DT,MINUTE_OF_DT,SECOND_OF_DT,MONTH_BEGIN,MONTH_END,YEAR_BEGIN,YEAR_END, and related leap/year helpers.libraries/oscatnow also ships the first larger string and logic slices, includingMONTH_TO_STRING,WEEKDAY_TO_STRING,DT_TO_STRF,TO_LOWER,TO_UPPER,LOWERCASE,UPPERCASE, theISC_*/IS_*predicate helpers, theFIND_CHAR/FIND_CTRL/FIND_NONUM/FIND_NUM/FINDB*/FINDPsearch helpers, plusCAPITALIZE,CLEAN,COUNT_CHAR,COUNT_SUBSTRING,CODE,DEL_CHARS,TO_UML,DEC_TO_BYTE,DEC_TO_DWORD,DEC_TO_INT,BYTE_TO_STRB,BYTE_TO_STRH,DWORD_TO_STRB,DWORD_TO_STRH,BIN_TO_BYTE,BIN_TO_DWORD,HEX_TO_BYTE,HEX_TO_DWORD,OCT_TO_BYTE,OCT_TO_DWORD,MIRROR,REPLACE_ALL,REPLACE_CHARS,REPLACE_UML,CHARCODE,CHARNAME,TICKER,LTCH,LTCH_4,STORE_8,COUNT_BR,COUNT_DR,TOGGLE,FF_D2E,FF_D4E, andFF_DRE.libraries/oscatnow also ships the rest of the current logic surface:FF_JKE,FF_RSE,SELECT_8,SHR_4E,SHR_4UDE,SHR_8PLE,SHR_8UDE, the full current gate-logic helper slice (DEC_*,MUX_*,BIT_*,BYTE_*,WORD_*,DWORD_*,SHL1,SHR1,SWAP_*,REAL_TO_DW,DW_TO_REAL,CHK_REAL,REFLECT,REVERSE), plus generator trigger FBsA_TRIG,B_TRIG, andD_TRIG.libraries/oscatnow also ships the full current/Logic/generatorsand/Logic/memoryslices:CLICK_CNT,CLICK_DEC,CLK_DIV,CLK_N,CLK_PULSE,CYCLE_4,GEN_BIT,GEN_SQ,SCHEDULER,SCHEDULER_2,SEQUENCE_4,SEQUENCE_8,TONOF,TP_X,FIFO_16,FIFO_32,STACK_16, andSTACK_32.libraries/oscatnow also ships the/Logic/Others,/Buffer Management,/List Processing,/Mathematical/Geometry, and/Mathematical/Double Precisionslices:CRC_GEN,MATRIX,PIN_CODE,_BUFFER_*,BUFFER_*,LIST_*,REAL2,R2_*,CIRCLE_*,CONE_V,ELLIPSE_*,SPHERE_V, andTRIANGLE_A.- Added
docs/guides/OSCAT_LIBRARY_GUIDE.mdplus an expandedexamples/oscat_smokewalkthrough so the shipped OSCAT package now has a user-facing reference and a concrete consumer guide comparable to the motion-library docs. - Runtime benchmark scripts now share a documented host-codegen policy via
TRUST_RUNTIME_HOST_CODEGEN=auto|generic|native, defaulting to host-native builds only on Raspberry Pi benchmark hosts while keeping portable/generic builds explicit for shared comparisons and release artifacts. - User-facing build docs now also cover the full host-native and PGO runtime build workflow, including the required
llvm-tools-previewsetup, corpus-training commands, and current Raspberry Pi 5 benchmark evidence (full_demoabout433.501 us -> 404.353 uswithnative, then about292.298 uswithnative+PGO). - Added
docs/diagrams/architecture/runtime-bytecode-vm-execution.pumland corrected the high-level runtime architecture notes so the official diagrams now distinguish production bytecode-VM execution from residualEvalContext/legacy-interpreterhelper paths. trust-runtime bench projectnow benchmarks a real project folder with watched-global capture, cycle-budget reporting, per-cycle latency summaries, and budget-overrun counts, so reusable Structured Text libraries can be validated through user-facing example projects instead of only synthetic fixtures.- Added
examples/plcopen_motion_single_axis_demoas the reference consumer forlibraries/plcopen_motion/single_axis_core, plusscripts/runtime_motion_example_bench_gate.shfor focused end-to-end semantic + cycle-budget validation of the shipped PLCopen motion surface. - Added
examples/plcopen_motion_single_axis_benchmarksplusscripts/runtime_motion_benchmark_breakdown.shto isolate runtime floor,MC_Constants(), status/readback, inactive-command, single-command, and constants-once motion costs on the same release benchmark path. scripts/runtime_motion_benchmark_breakdown.shnow forces a freshcargo build --release -p trust-runtime --bin trust-runtimebefore benchmarking so release measurements cannot accidentally reuse a staletarget/release/trust-runtimebinary.trust-runtime bench projectnow emits VM register-profile details for VM-backed workloads, including hot blocks, fallback reasons, and lowering-cache counters, so project benchmarks can explain where scan time is going instead of only reporting latency totals.trust-runtime bench projectnow emitsvm_profile.ref_opsandvm_profile.call_opsin JSON/table output, andscripts/runtime_motion_benchmark_breakdown.shnow summarizes those counters per workload so VM performance investigation runs show ref-path and FB/frame activity directly instead of hiding it in raw runtime state.trust-runtime bench projectnow also emitsvm_profile.value_opsin JSON/table output, andscripts/runtime_motion_benchmark_breakdown.shnow summarizes value-clone/move attribution (const loads, register reads, read-side value clones, binding expr clones, output copy-back clones) so runtime speed work can distinguish read-path churn from register-file churn.trust-runtime bench projectnow also emitsvm_profile.tier1_specialized_executorin JSON/table output, and the experimental tier-1 compiler now supportsRefField,RefIndex,LoadDynamic, andStoreDynamicso ref-heavy FUNCTION_BLOCK blocks show up in benchmark compile/deopt/execution evidence instead of staying invisible behindnulltier-1 stats.VariableStoragenow caches instance-field resolution per instance, with invalidation on new instance-field insert, so repeated FUNCTION_BLOCK self-field access and parameter binding can skip repeated field-name lookup without assuming that all same-type instances always share the exact same runtime layout.- VM FUNCTION_BLOCK argument binding now uses a direct declared-parameter offset fast path with recursive fallback for inherited or unusual fields, trimming repeated binding overhead on ref-heavy release benchmarks without changing call semantics.
- VM output copy-back and empty-path storage access now use direct-slot
VmWriteTarget/VariableStoragefast paths for locals, globals, and instances, reducing genericValueRefresolution on the hot benchmark path without changing runtime semantics. - VM
INarguments that arrive as empty-path target references now reuse the same direct-slotVmWriteTargetread path for locals, globals, and instances, trimming generic reference reads on ref-heavy hot paths without changing call semantics. - VM dynamic reference shape inspection now borrows storage/local values for
REF_FIELDandREF_INDEXtraversal instead of cloning them first, which materially improves ref-heavy release motion workloads without changing runtime semantics. - VM hot paths now also borrow output target type inspection for
write_output_int()and use borrowed DINT fast paths for fused ref+const/register guards inregister_ir, trimming unnecessary clone/materialization work on ref-heavy micro-benchmarks without changing runtime semantics. - VM FUNCTION_BLOCK binders now skip field resolution when
OUT/IN_OUTparameters are omitted, use an ordered named-argument fast path for the common declaration-order case, and decode native call payloads in pop order instead of reversing/removing a payload vector on every call. - Runtime
Value::Structnow uses shared-on-clone copy-on-write storage, which removes the remaining deep-clone hot path for PLCopen-styleAXIS_REFVAR_IN_OUTtransfers; on the rebuilt motion demo gate this cutsread_value_clonesfrom6467to227, eliminatesoutput_value_clones, and improves release latency to aboutp50 424 us/p95 649 uswith clean semantics. trust-runtime bench projectnow keeps VM profiling enabled by default while leaving the experimental tier-1 specialized executor opt-in via--tier1, so normal speed baselines stay on the primary VM path and diagnostic tier-1 cache/compile/deopt evidence is still available when explicitly requested.trust-runtime bench projectandscripts/runtime_motion_benchmark_breakdown.shnow also surface tier-1 compile-failure reasons alongside deopt reasons, so remaining specialization misses can be attributed to exact unsupported instruction/op buckets instead of only a genericcompile_failurescount.- The experimental tier-1 VM path now also compiles
LoadRefAddrandCallNative, and widens binary specialization to the generic non-DINT fallback path (includingAND/OR), so the motion benchmark matrix now reachescompile_failures = 0/deopts = 0in tier-1 profiling runs while preserving clean motion semantics. - VM ref-binary execution now reuses the first borrowed ref/const read on non-DINT fallback in both the interpreted register executor and the tier-1 executor, removing duplicate storage reads and bogus clone accounting on BOOL/REAL/UINT/WORD-style ref binaries; the rebuilt motion breakdown improves over the tier-1-complete state (
dynamic_refs 34.834 us,full_demo 478.836 us) while preserving clean motion semantics. - The register VM and experimental tier-1 executor now lower and execute
LOAD_SUPER (0x24), so method receiver /SUPERcall paths no longer fall back throughunsupported_opcode_0x24on the current-code benchmark surface.
Changed¶
trust-runtime testnow prepares one runtime per project and reuses it across discovered cases instead of recompiling the whole ST project for every case, which removes false timeout growth on larger OSCAT fixtures.- truST now accepts direct
CHAR_TO_BYTE/WCHAR_TO_WORDconversion-style helpers, and the shipped OSCATCODE()helper now uses that fast path instead of a brute-force byte scan; the OSCAT core fixture is back to passing at the default--timeout 5. trust-runtimeis now VM-only in production: thelegacy-interpreterfeature, interpreter backend dispatch seam, and interpreter runtime paths are gone; CLI/config startup selection still acceptsvmand now rejectsinterpreterexplicitly.- Removed
trust-runtime bench execution-backendand the interpreter differential gate flow; VM-only syntax-corpus, determinism/reliability, and production-backend guard scripts now carry the runtime evidence path. - Hardened
scripts/runtime_vm_syntax_corpus.shso the default corpus skips stale missing fixture folders instead of aborting halfway through a benchmark run. - Runtime docs/diagrams/specs now describe
program_modelplus boundedhelper_evalhelpers as the surviving support surface around the VM, and executor internals undersrc/eval/**are confined to test-only coverage. -
Rewrote the user-facing PLCopen motion documentation so the single-axis demo README now explains the example itself and the main library guide now serves as a real reference manual with package wiring, datatype purpose tables, and per-function-block input/output coverage.
-
Structured Text
FUNCTION_BLOCKcalls now reuse the previously storedVAR_INPUTvalue when an input argument is omitted, with first-call fallback still using the declared initializer or IEC default; this closes the motion-library command-update semantics gap without inventing separate runtime rules. - Structured Text indexing now supports nested
field[index]/index.fieldchains and character indexing onSTRING/WSTRING, so OSCAT-styleLANGUAGE.DIRS[ly, i]access and IEC string element forms compile and execute without fallback workarounds. - Web IDE build/deploy behavior now matches CLI semantics in unified shell flows: build tasks use project-root
--projectresolution, deploy normalizessrc/-prefixed source paths to avoid nestedsrc/srcwrites, and online connection defaults now seed same-origin host/port for faster standalone startup. - Web IDE header controls now use a compact primary toolbar (
Open,Save,Build,Deploy) with overflow menu actions for lower visual clutter while preserving the full command set. - VS Code HMI widget-navigation source scanning fallback was merged on top of current mainline traversal logic so declaration resolution stays deterministic for
.st/.pouprojects after main-branch merge. - MP-060 production backend policy now enforces VM-only startup for
trust-runtime run/play:--execution-backendacceptsvmonly,runtime.execution_backend='interpreter'is rejected by runtime config validation, omitted backend config defaults tovm, and run/play startup now fails fast when a legacy interpreter backend is present in runtime bundle settings. - MP-060 setup/wizard runtime templates now emit
runtime.execution_backend = "vm"by default so newly generatedruntime.tomlfiles validate and start under VM-only production policy. - MP-060 no-bundle and source-compiled runtime startup now always applies compiled bytecode before execution backend selection so VM-only startup has loaded bytecode metadata in both project and IDE-shell startup flows.
- MP-060 interpreter internals are now explicitly feature-gated behind
legacy-interpreterfor parity-only workflows (differential/benchmark/debug parity tests), while default production builds remain VM-only. - MP-060 runtime/harness defaults now execute through VM paths with automatic bytecode materialization from runtime metadata when VM bytecode has not been preloaded, preventing implicit interpreter execution in default runtime/test flows.
- MP-060 CI now enforces a production backend leak guard (
scripts/runtime_vm_production_backend_guard.sh) to fail if run/config/control/template/runtime-default surfaces regress to interpreter references. - MP-060 migration/docs/checklists updated for restart execution: added detailed recovery board
docs/internal/testing/checklists/mp-060-vm-restart-recovery-checklist.mdand updated backend migration/spec/master-plan text to reflect interpreter test-oracle-only policy. - MP-060 post-C1 recovery pass implemented for register VM hot path (
P0 -> P2 -> P1): boxed large runtime value variants (Array/Struct/Enumwith unboxedReference), added extended register-op fusion (BinaryRefToRef,BinaryRefConstToRef,BinaryConstRefToRef,CmpRefConstJumpIf) with tier-1 specialized-executor support, and added consume-aware per-block register read paths; refreshed lockedmp-060-corpus-v33-run benchmark evidence and comparison artifacts intarget/gate-artifacts/runtime-vm-bench-v3-post-p0-p2-p1-run1/. - MP-060 post-hotpath correction pass:
execution-backendbenchmark corpus upgraded tomp-060-corpus-v4with per-cycle loop-state reset inloop-arith, VM profile guardrails now assert loop-body execution during measured cycles, benchmark comparison now uses 3-run median-of-runs decision metrics (scripts/runtime_vm_bench_compare.sh) with aggregate median derived from per-fixture medians (instead of pooled cross-fixture sample p50), and register-IRCALL_NATIVEnow reuses a program-level pooled operand stack (removing per-call stack allocation churn) alongside cached per-program read metadata and direct block-id indexing in the register executor. - Runtime specs/docs synchronized to VM-default production backend policy:
docs/specs/10-runtime.mdanddocs/specs/README.mdnow describe bytecode VM execution as the primary runtime path, with interpreter execution documented as legacylegacy-interpreterparity/test-oracle flow only. trust-runtime plcopen importnow defaults to native CODESYS/TwinCAT-style global-list materialization: file-scope GVLs stay asVAR_GLOBALfiles,qualified_onlylists import as namespaced GVLs, and mandatoryVAR_EXTERNALinjection is no longer the default import shape. A strict adapter mode remains available for wrapper + injected-VAR_EXTERNALreshaping when external consumers need it.- The canonical PLCopen motion demo now initializes
MC_Constants()once during startup instead of republishing its outputs every scan, so the reference benchmark reflects the cheaper steady-state usage pattern already documented by the library guide. - Register-IR hotpath coverage now includes
LOAD_SELF (0x23), complex local-ref execution, and CASE block-entry stack modeling, project-bench VM hot-block reports resolve readable POU names, and lowering-cache fallbacks now preserve the failing POU name plus the original lowering error message. On the PLCopen motion demo this removes the oldunsupported_opcode_0x23,complex_local_ref_path, andMainlowering-error buckets and keeps the release gate comfortably under the 10 ms cycle budget with0VM fallbacks.
Fixed¶
- Runtime and VM execution now handle nested field/index lvalue chains, string and WSTRING dynamic indexing, split-local/initializer parity, and debugger force/release on direct instance fields consistently across harness, VM, helper-eval, and debug-adapter paths.
- HIR/syntax now parse and type-check
TIME()as a zero-argument builtin, allowSTRING/WSTRINGindexing in expressions, accept stringCASElabels and fixed-length string comparisons, and document the shipped implementer conversion extensions (TIME_TO_DWORD,DWORD_TO_TIME,CHAR_TO_BYTE,WCHAR_TO_WORD). trust-ide/trust-lspnow surface the shipped pointer/ARRAY[*]/IECCONSTANTsemantics consistently across completion, hover, semantic tokens, signature help, workspace symbols, inline values, refactor const-analysis, and constant-section diagnostics instead of drifting behind the HIR fixes.- Project analysis now honors cross-file
VAR_GLOBAL CONSTANTinteger expressions in type-length contexts such asSTRING[MaxLen], and the OSCAT BASIC CRC/buffer helpers now use the shippedARRAY[*]/POINTER TO ARRAY[*]compatibility forms without giant caller-side ceremony arrays. - IEC
CONSTANTqualifier handling now preserves parameter/VAR_TEMPidentity in HIR, rejects writes through the sharedConstantModificationpath, blocks function block instances inCONSTANTsections, and keeps parameter/VAR_TEMPdeclarations out of compile-time constant-expression evaluation. - Bytecode VM lowering now executes
EXITandCONTINUEcorrectly inFOR,WHILE, andREPEATloops instead of rejecting those statement paths through the generic C5 fallback. - HIR comparison rules now treat same-family
STRINGandWSTRINGvalues as comparable regardless of declared max length, so fixed-length values such asSTRING[1]andWSTRING[1]compare cleanly against compatible literals and variables. - Pointer support docs and regression coverage now explicitly lock the supported string-pointer path (
ADR(str)with typed dereference/indexing such asp^[i]) while keeping raw byte-array reinterpret casts and pointer arithmetic outside the supported runtime model. CASEnow acceptsSTRING/WSTRINGselectors and literal labels in runtime/lowering paths, with an explicitIEC-DEC-024policy that string subranges remain rejected as an implementer decision for the ambiguous IEC area.- FUNCTION_BLOCK omitted
VAR_INPUTcalls now follow the documented runtime semantics: instance creation seeds declared input initializers, first omitted calls observe that seeded value, and later omitted calls reuse the stored instance input instead of reevaluating the declaration on every call. trust-runtime bench projectnow applies the project's configured runtime execution backend and the motion example bench gate acceptsTRUST_MOTION_MAX_OVERRUNS/TRUST_MOTION_P95_MAX_USoverrides for hardware-specific performance gating.trust-runtime testnow executes discoveredTEST_PROGRAMs even when a project includes aCONFIGURATION, while normal configured runtime builds continue to register only configured programs.trust-runtime test --projectnow compiles sources from local[dependencies]packages in addition to the project's ownsrc/, so extracted Structured Text libraries can be consumed from real package roots instead of living inside test fixtures.trust-runtime testnow preloads bytecode before per-case timeout accounting, so filtered project runs do not burn their timeout budget on the first lazy VM-module build.- Multi-file HIR import now preserves configuration/resource global lookup bindings, so vendor-parity bare global access continues to resolve after splitting projects across source files.
- Runtime assignment writes now preserve declared scalar storage types in both interpreter and VM paths, so loop counters keep their declared
INT/UINT/etc. representation and exact-source conversion calls such asINT_TO_DINT(...)no longer fail insideFORandWHILEloops. - Structured Text infix bitwise operators now accept
BOOL/ANY_BIToperands with the same widening behavior as the standardAND/OR/XOR/NOTfunctions, and&now type-checks as theANDsynonym instead of falling through asUNKNOWN. VAR_STATnow executes with documented vendor semantics in the runtime: function statics persist across calls, method statics persist per instance/method, and instance-bearing scopes treatVAR_STATas persistent instance storage.- VM execution now initializes declared local storage before user bytecode runs, so local declaration initializers and split-style standard-library writes to function-local outputs behave the same way in runtime and VM paths.
Added¶
- Shipped the first PLCopen Motion library profile in Structured Text: Part 1 single-axis classic core, Part 1 synchronization cam/gear subset, Part 4 coordinated-motion core subset, and Part 5 homing core subset, with a compliance matrix, user-facing guide, deferred-surface guards, and deterministic ST conformance fixtures.
- truST now accepts namespaced vendor-style GVL declarations (
NAMESPACE ... VAR_GLOBAL ... END_NAMESPACE) and resolves qualified access such asGVL.sharedin both HIR and runtime execution. - truST now records vendor-parity global access explicitly: top-level GVLs, namespaced GVLs, and direct global access without mandatory
VAR_EXTERNALare documented and covered by regression tests. trust-harnessnow provides a lightweight JSON-line test driver for compiled ST programs, includingcycle.dt_msvirtual-time advancement and typedTIME/LTIMEwatch output for timer-oriented automation.- LSP/type-checker numeric hazard warnings now flag floating-point equality/inequality comparisons (
W013) andDIV/MODexpressions with literal zero divisors (W014), with a dedicatedwarn_numeric_hazardsdiagnostics toggle for vendor/workspace tuning. - VS Code SFC visual editor integration (IEC 61131-3 style step/transition canvas, runtime panel wiring, and bundled EtherCAT Snake SFC examples) is now included in mainline extension workflows.
- MP-060 Phase A execution-backend controls for
trust-runtime: newruntime.execution_backendconfig (interpreter|vm), new CLI override--execution-backend=interpreter|vmforrun/play, startup backend-selection log event, backend mode/source fields in controlstatus/config.get, and Prometheus backend info metric (trust_runtime_execution_backend_info).vmselection is intentionally fail-fast until VM execution lands in the next MP-060 phase. - MP-060 Phase B VM core for
trust-runtime:runtime.execution_backend='vm'now runs a real bytecode executor with deterministic program-counter dispatch, operand and call/frame stacks, trap/deadline/budget enforcement, stable trap-to-RuntimeErrormapping, and slot/index-based VM hot-path access with symbol/source mapping tables preserved for external/debug name-based surfaces. Interpreter remains the default backend. - MP-060 Phase C1 call-parity rollout for
trust-runtime: VM codegen/dispatch now emits and executesCALL_NATIVE(kind/symbol/arg_count) for function/FB/method/stdlib paths, routes builtin FB and stdlib behavior through the same native-call convention, preserves named/default/IN_OUT parity, and replaces C1-required silent NOP call fallthrough with deterministic compile/validate/runtime failures. - MP-060 Phase C2 string parity rollout for
trust-runtime: VM bytecode lowering/execution now supportsSTRING/WSTRINGliterals (including stdlib call arguments and comparison expressions), adds deterministic UTF validation for string const payloads, and removes remaining C2 silent-NOP fallback behavior for string-literal control-flow lowering paths. - MP-060 Phase C3 OOP parity rollout for
trust-runtime: VM lowering/runtime now supports explicitTHIS/SUPERreceiver expressions (LOAD_SELF/LOAD_SUPER) for method/native-call paths, adds deterministicSUPERtrap semantics, and extends differential/opcode conformance coverage for method/interface dispatch including malformed method receiver payload rejection. - MP-060 Phase C4 reference/deref parity rollout for
trust-runtime: VM lowering/runtime now supportsREF(...)lowering, dereference execution (LOAD_DYNAMIC/STORE_DYNAMIC), and nested field/index chain composition (REF_FIELD/REF_INDEX) with deterministic validator/runtime failures for invalid field-string indices and malformed dynamic-reference operands. - MP-060 Phase C5 parity rollout for
trust-runtime: VM lowering/runtime now supportsSIZEOF(type)/SIZEOF(expr)(SIZEOF_TYPE/SIZEOF_VALUE), adds deterministic validator/runtime opcode failure coverage for C5 paths, and replaces silent VM-lowering fallthrough for remaining C5 edge statements (?=/JMP/RETURN/EXIT/CONTINUE) with deterministic compile-time rejection. - MP-060 Phase C audit follow-up hardening for
trust-runtime: added per-subphase negative-path interpreter-vs-VM differential coverage (C1..C5), extended C2 string stdlib parity coverage to include bothFINDfound/not-found paths, and added a deterministicSIZEOF_TYPErecursion-depth guard (max depth 128) for deep non-cyclic type-table graphs. - MP-060 Phase D debug/observability parity for
trust-runtime: VM execution now resolves statement stops through bytecode debug-map(pou_id, pc)source mappings, preserves breakpoint/step and debug-write workflow parity with interpreter mode, and keeps backend metrics/runtime-event observability contracts stable across interpreter and VM backends. - MP-060 Phase E online-change groundwork for
trust-runtime: hot-reload semantics are now centralized in a dedicated runtime online-change contract (apply_online_change_bytes) with cycle-boundary swap handling, warm-restart entrypoint invalidation, retain/global/instance migration coverage, deterministic invalid-bytecode diagnostics, and explicit startup-only backend-switch diagnostics for liveconfig.setrequests. - MP-060 Phase E rollout-gate closure: added a dedicated backend migration note (
docs/guides/RUNTIME_EXECUTION_BACKEND_MIGRATION.md) covering CLI/config rollback controls and the two-release interpreter compatibility window policy, plus explicit release-evidence gate documentation forversion-release-guardartifact aggregation. - MP-060 benchmark groundwork: added
trust-runtime bench execution-backend(mp-060-corpus-v1) for interpreter-vs-VM cycle latency/throughput comparison, plus CI evidence capture viascripts/runtime_vm_bench_gate.shand published artifact/docs pointers (gate-artifacts/runtime-vm-bench/**,docs/internal/reports/mp-060-runtime-vm-benchmark-corpus.md). - MP-060 Phase C hotspot profiling: added runtime-scoped register-VM profile controls/snapshot APIs and extended
trust-runtime bench execution-backendfixture reports withvm_profiledetails (register execution/fallback counters, fallback reasons, top hot blocks, and profiling-overhead ratio). - MP-060 Phase D tier-1 specialized register-executor pilot: added an experimental hot-block specialization tier in the register VM (guarded compile subset for arithmetic/compare/branch, deopt-to-register-interpreter fallback, cache capacity/eviction controls, and bytecode-reload invalidation), plus benchmark artifact fields for tier-1 specialized-executor counters/deopt reasons and focused unit coverage for startup/deopt/cache behavior.
- MP-060 register executor now caches lowered register IR per
(module,pou)with runtime-owned invalidation on bytecode reload, eliminating per-cycle relowering and block-map allocation; benchmark reporting now includes lowering-cache hit/miss/eviction stats and uses expandedmp-060-corpus-v2fixtures (call-binding,string-stdlib,refs-sizeof,loop-arith). - IDE settings coverage expanded for standalone/offline authoring: new fields for control endpoint/resource name, runtime cloud profile, extended OPC UA options, and observability options.
- IDE settings discoverability improvements:
/ide/settingsnow opens in anAll Settingsview by default and adds filter-by-name/key search so MQTT/PLC/TLS/realtime/debug configuration is immediately accessible. - IDE settings reliability hardening:
/ide/settingsnow includes standalonesimulation.tomlcontrols (simulation.enabled,simulation.seed,simulation.time_scale), shows active filter summary/clear controls to prevent hidden-field confusion, and limits liveconfig.setwrites to backend-supported keys to avoid false save failures. - IDE settings navigation hardening: hardware/quick-action jumps now auto-clear stale settings filters and auto-fallback to the owning category (or
All Settings) so target fields are always visible when jumping to PLC/MQTT/TLS/realtime/debug settings. - IDE I/O settings completeness hardening: both Settings and Hardware editors now preserve
use_system_iofrom loaded I/O configs instead of silently forcing it tofalseon save. - Default standalone Web IDE demo project (
examples/web_ui_complete_project) now includes a multi-driverio.toml(Modbus TCP, MQTT, EtherCAT mock, GPIO, Simulated) so Hardware and Settings communication flows are populated immediately. - IDE communication workflow hardening in the unified shell:
- Settings now shows inline JSON examples for
runtime_cloud.wan.allow_write_jsonandruntime_cloud.links.transports_json. - Realtime link rule parsing now accepts
source/target,from/to, andpatternaliases for faster authoring while still writing validruntime.cloud.links.transportsTOML entries. - Runtime-cloud link transport support now spans
realtime,zenoh,mesh,mqtt,modbus-tcp,opcua,discovery, andwebacross runtime schema validation, config APIs, and the Hardware/Settings editors. - Hardware
Add Linkflow now uses an in-UI transport picker (all 8 transports) plus guided source/target hinting instead of raw text prompt input. - Hardware inspector now deep-links all communication/runtime-cloud modules to their exact Settings fields.
- Added MQTT connectivity probe route
POST /api/io/mqtt-testand Hardware inspectorTest Connectionsupport for MQTT alongside Modbus TCP. - Hardware communication cards now also project
runtime.cloud.wan.allow_writeasCloud WAN Access. - IDE mobile responsiveness hardening for
/ide: stacked layout now keeps the main workspace visible on narrow screens and avoids sidebar-only view lockups. - Fixed settings schema mismatch for Modbus
on_error: UI options now match runtime driver-supported values (fault,warn,ignore). - Unified Web IDE shell with tab-based navigation (Code | Hardware | Settings | Logs):
- Root
/and/setupnow redirect to/ide. - Legacy fleet web routes removed from the runtime web server (
/fleet,/app.js,/styles.css,/runtime-cloud-utils.js, and legacy/modules/*fleet assets). - Added standalone browser IDE startup via
trust-runtime ide serve --project <path> --listen <addr>(with deprecated aliastrust-runtime config-ui serve). - Tab deep links:
/ide/code,/ide/hardware,/ide/settings,/ide/logs. - Keyboard navigation: Ctrl+1..4 for tab switching, URL history with pushState.
- Hardware tab: Cytoscape topology canvas, module palette with drag-and-drop, auto-address allocation, property editor with per-driver forms (Modbus TCP, MQTT, GPIO, EtherCAT), address map table with conflict/unused/used-in-code highlighting, live I/O value polling.
- Hardware tab now auto-hydrates from workspace
io.tomlvia new/api/ide/io/configendpoint so configured hardware/communication drivers appear on the canvas immediately (including deep-link/ide/hardwareloads). - Hardware tab now renders a full workspace layout (summary KPI cards, surface controls, driver/runtime communication cards, persistent inspector), fixes tab-shell row sizing so content fills the page (status bar no longer consumes the main viewport), and hydrates runtime communication sections from
runtime.tomlinto the hardware communication view. - Hardware tab now also hydrates from
runtime.tomlcommunication sections whenio.tomlis missing, so standalone projects still show communication modules on the canvas instead of an empty hardware view. - Settings tab: categorized form (General, Execution, Retention, Communication, Security, Advanced), direct runtime.toml editing, settings export/reset.
- Logs tab: unified log view with severity/source/text filtering, alarm acknowledgment, CSV export.
- Logs CSV export filenames now follow the user-story format exactly:
truST-logs-YYYY-MM-DD-HHMMSS.csv. - Connection dialog: mDNS discovery scan, manual connect, recent connections.
- Deploy flow: error gating, confirmation, sync status indicator (in-sync/modified/not-deployed).
- Debug integration: breakpoints with gutter decorations, debug toolbar (Continue/Step Over/Step Into/Step Out/Stop), variables/call stack/watch panels, live inline value annotations, I/O force/unforce with warning banner.
- New IDE modules:
ide-tabs.js,ide-hardware.js,ide-online.js,ide-debug.js,ide-settings.js,ide-logs.js. - New CSS:
ide-06.css(tabs),ide-07.css(hardware),ide-08.css(online/debug),ide-09.css(settings/logs). - 5 new unified shell contract integration tests in
web_ide_integration_part_09.rs. - IDE session bootstrap now recovers reliably in standalone mode by persisting/reusing session tokens across reloads and evicting the stalest inactive session when the session cap is reached (prevents repeated
/api/ide/session429 lockouts during active web-UI development). - Hardware canvas labels now compact long address ranges and enable wrapped node text to keep TOML-derived module/address data legible on the graph.
- Hardware Cytoscape theming now resolves IDE CSS variables to concrete colors and updates on theme changes, eliminating runtime style warnings while preserving light/dark parity.
- Hardware tab visual redesign now uses a canvas-first layout with a much larger default graph surface, collapsible inspector/driver panels, in-canvas communication legend/filter controls, center/fullscreen actions, and SVG-based component iconography (replacing emoji palette glyphs) for a modernized runtime topology editing workflow.
- Hardware node art polish pass now upgrades node cards with richer per-protocol gradients/glows, glass label treatment, and higher-fidelity SVG chip icons (including distinct analog/communication module icon rendering) without changing interaction workflow.
- Hardware node visuals now render generated card-style SVG backgrounds per node (runtime/endpoint/module variants with accent rails + icon chips) and enforce higher minimum zoom/readability so topology labels/icons stay legible at dense graph sizes.
- Hardware canvas visual hardening now uses Cytoscape-safe SVG icon rendering for node cards (fixes missing icon layers in Chromium canvas rendering) and retunes card dimensions/colors for a cleaner production graph look.
- Hardware tab chrome simplification removes summary KPI cards, runtime/fabric control strip, and active-link/legend toolbar from the canvas stage so palette + topology become the primary workflow surface.
- Hardware node context menu now de-duplicates endpoint settings navigation: endpoint nodes expose only one settings jump action while runtime nodes keep separate runtime and communication settings actions.
- Runtime cloud multi-host topology demo pack:
- Added
examples/runtime_cloud/multi_host_topology_demo/withbootstrap.sh,start-5.sh, andstop-5.sh. - Added per-runtime sample configs for 5 runtimes (
runtime-a..runtime-e) with mixedmqtt,modbus-tcp,ethercat,simulated, andloopbackI/O profiles. - Added preloaded manual topology seed (
topology-devices.runtime-a.json) to exercise host containers, manual devices, and module-slot rendering during UI testing. - Changed bootstrap defaults to TOML/API-first: manual topology JSON and legacy link-transport JSON are now opt-in only (
TRUST_TOPOLOGY_DEMO_SEED_MANUAL=1,TRUST_TOPOLOGY_DEMO_SEED_LINK_JSON=1). - Added TOML runtime-cloud link preference support via
runtime.cloud.links.transportsand seeded demo link lanes fromruntime-a.toml. - Added TOML discovery host grouping via
runtime.discovery.host_groupand host-group-aware runtime-cloud same-host evaluation for localhost multi-host demos. - Runtime cloud topology visual map in Web UI:
- Reworked
Network -> Topologyinto a graphical runtime map with box nodes and connection lines. - Added at-a-glance status-focused KPIs (
online,degraded,offline, link health) for operator use. - Moved diagnostic-heavy controls (filters, tables, timeline, rollout/config control surfaces) into a collapsed advanced section to reduce default clutter.
- Runtime cloud edge transport switching in Fleet view:
- Clicking topology links or edge cards now allows direct
Realtime/Zenohtransport switching. - Added
/api/runtime-cloud/links/transportwith same-host validation forrealtimerouting preferences. - Fleet topology state now reflects selected link transport (
t0_hard_rtoverlay for realtime links). - Promoted topology to primary workflow with in-canvas plane/keyspace/issue filters, contextual node/edge inspector, and batch action bar for selected runtimes.
- Moved compact timeline controls into topology map while keeping deep diagnostics under the advanced drawer to reduce default UI clutter.
- Communication lines now render per-lane overlays (Zenoh + optional Realtime), with left-click showing only critical lane status/settings and right-click lane actions for add/remove realtime communication.
- Fleet topology deterministic ownership slots:
- Fleet topology now renders runtime-owned driver nodes (
mqtt,modbus,ethercat,opcua,gpio) between runtimes and endpoints. - Host assignment is enforced for operational endpoints: remote/discovered endpoints attach to deterministic external host containers instead of free-floating.
- Topology edit flow now requires host placement for manual devices and blocks host removal that would orphan hosted devices.
- Runtime cards now reserve deterministic in-card driver slot zones and driver cards render as compact protocol chips anchored to those fixed slots.
- Empty host containers are hidden in normal view when they have no runtime or endpoint children.
- Runtime/device cards now render a single border layer (removed Cytoscape outer border) to match card design and avoid double-outline artifacts.
- Runtime card subtitle no longer duplicates health state when the status badge already shows it.
- Driver slot placeholders now render without static protocol text; labels appear only on occupied slots.
- Driver nodes are now non-draggable to preserve deterministic runtime slot placement.
- Device edges are normalized to bind via runtime-owned driver nodes (including manual runtime->endpoint edges), and render as direct source-to-target lines from the driver chip.
- Runtime cards now render driver summary text in the body while driver chips are laid out as a single deterministic bottom row (no multi-row chip stacks).
- Driver chips now include compact protocol context subtitles (for example broker/address/adapter/internal) for faster visual inspection.
- Host compound labels are pinned inside host containers for clearer ownership headings.
- Carousel priming now guards missing
runtimeCloudStateto prevent early-page-loadReferenceErrorin browser console. - Fleet graph position caches are now layout-versioned and auto-relayout when stale pinned positions overlap runtime cards.
- External-only host groups now use deterministic anchor lanes so remote endpoint hosts do not collapse onto
(0,0)and overlap each other. - Runtime-internal I/O drivers (
simulated,loopback) now render as deterministic runtime-owned driver cards. - Comms add-driver flow now includes
loopbackalongsidesimulatedfor runtime-internal I/O driver configuration. - Modbus canonical endpoint normalization now handles
addressvalues that already include:port(prevents malformed duplicate-port canonical keys). - Demo topology seed data now keeps manual endpoints hosted (no hostless manual operational devices).
- Added config-mode runtime topology writeback endpoints:
POST /api/config-ui/runtime/createandPOST /api/config-ui/runtime/delete. - Topology edit UI now supports runtime create/remove actions in edit mode and routes adapter actions through TOML-backed config flows.
- Added config-ui live connection manager APIs (
GET/POST /api/config-ui/live/targets,POST /api/config-ui/live/targets/remove,POST /api/config-ui/live/connect,GET /api/config-ui/live/state) with in-memory target profiles and read-only runtime-cloud polling. - Added config-ui runtime lifecycle provider APIs (
GET/POST /api/config-ui/runtime/lifecycle) for runtime status/probe plus managed start/stop/restart actions. - Config-mode
/api/runtime-cloud/statenow supports read-only live overlay of node/edge health from connected runtime-cloud snapshots without changing TOML-derived topology ownership/layout. - Added config-ui integration tests for runtime create/delete and ST/runtime conflict-safe writeback paths.
- Removed active topology-devices overlay route dependency; runtime/config topology remains TOML/API-driven.
- PLCopen CODESYS global/folder parity:
trust-runtime plcopen importnow imports CODESYSaddData/globalVarsinto STVAR_GLOBALsources (plaintext-first with variable-node synthesis fallback).- CODESYS
addData/projectstructureobject trees are now used to place imported POUs/GVLs into mirroredsrc/subfolders (for examplesrc/Application/...). trust-runtime plcopen exportnow emits deterministic CODESYSglobalVarsandprojectstructuremetadata for ST POUs + GVL files.- Import/export JSON reports now include global-list and project-structure counters (
discovered/imported_global_var_lists, folder/object-node counts).
Changed¶
libraries/oscat/srcand the OSCAT core/negative conformance fixtures now follow the OSCAT manual chapter structure (03_data_typesthrough26_list_processing) instead of a flat source bucket, so continued porting can proceed chapter-by-chapter with tests in the matching chapter first.- VS Code statechart automated coverage:
- Added editor lifecycle test coverage to verify running statechart sessions are cleaned up when a custom editor panel is disposed.
- Added state machine engine behavior tests for awaited hardware action ordering and fail-closed guard evaluation paths.
- Added runtime client timeout cleanup coverage to ensure request listeners are removed on timeout/error.
- Web IDE project selection flow:
- Added
/api/ide/projectand/api/ide/project/opento query/switch active project root at runtime. - Added no-bundle startup support for
trust-runtime runso/idecan start first and open a project folder from the browser. - Added integration coverage for no-bundle project-open flow in
crates/trust-runtime/tests/web_ide_integration.rs. - Web IDE workspace scope hardening:
- Changed IDE file/tree scope from fixed
<project>/srcto full active project root with hidden/system path filtering. - Added project-aware command execution guard so build/test/validate require an active project selection.
-
Added task status timestamps in
/idetask panel (started/finished) to satisfy workflow traceability requirements. -
Web IDE full implementation closure for
/ide: - Added workspace tree + filesystem mutation endpoints and UI flows (
/api/ide/tree,/api/ide/fs/create,/api/ide/fs/rename,/api/ide/fs/move,/api/ide/fs/delete) with conflict-safe errors. - Added IDE navigation/search surface: quick open, workspace text search with include/exclude globs, file/workspace symbol search, and command-palette actions.
- Added project-aware language navigation endpoints and UI wiring for go-to-definition, references, and rename (
/api/ide/definition,/api/ide/references,/api/ide/rename) with cross-file analysis context. - Added build/test/validate task orchestration endpoints (
/api/ide/build,/api/ide/test,/api/ide/validate,/api/ide/task) with streaming output, parsed source-location links, and retry UX in the browser IDE. - Added browser IDE format endpoint and command flow (
/api/ide/format) so formatted content can be applied from the editor command surface. - Added filesystem mutation audit trail endpoint (
/api/ide/fs/audit) and health counters (fs_mutation_events) for IDE security observability. - Added dedicated Web IDE contract/performance/security integration coverage in
crates/trust-runtime/tests/web_ide_integration.rsand parser/unit coverage incrates/trust-runtime/src/web.rs+crates/trust-runtime/src/web/ide.rs. - Added a standalone static browser demo at
docs/demo/with all 7 LSP features running fully client-side through WebAssembly, plus GitHub Pages deployment workflow (.github/workflows/demo-pages.yml) for client sharing. - Added Browser IDE runtime docs for
/ideindocs/guides/WEB_IDE_FULL_BROWSER_GUIDE.mdand linked them fromREADME.mdanddocs/README.md. - EtherCAT bring-up examples:
- Added
examples/ethercat_ek1100_elx008_v2/for EK1100 + EL2008-only hardware chains with a validated 8-output snake pattern. - Added helper run scripts and docs for real-NIC bring-up and deterministic mock-mode fallback.
- HMI Phase 0 scaffold start:
- Added runtime scaffold engine APIs
scaffold_hmi_dirandscaffold_hmi_dir_with_sourcesincrates/trust-runtime/src/hmi.rsto generate deterministichmi/directory artifacts from source metadata. - Added
trust-runtime hmi initCLI workflow (crates/trust-runtime/src/bin/trust-runtime/hmi.rs) with style selection (industrial|classic|mint) and deterministic generation summary output. - Added
trust-lsp.hmiInitworkspace/executeCommandsupport incrates/trust-lsp/src/handlers/commands.rs, reusing runtime scaffold generation from workspace sources and returning structured summary payloads. - Added VS Code LM tool
trust_hmi_initineditors/vscode/src/lm-tools.tsandeditors/vscode/package.json, routing HMI scaffold generation through the new LSP command path. - Added Phase 0 runtime scaffold tests for external symbol filtering, widget mapping by writability/type, deterministic output stability, and repeated-instance section grouping.
- Converted
docs/internal/testing/checklists/hmi-complete-implementation-checklist.mdinto a tracked execution board with active Phase 0 lanes and work item IDs. - HMI Phase 1.6 live descriptor refresh:
- Added runtime descriptor watcher (
notify) with debounce forhmi/*.tomlupdates and safe hot-reload without runtime restart. - Added
schema_revisiontohmi.schema.getpayloads and wired in-memory revision bumps on successful descriptor reload. - Added fail-safe invalid descriptor handling that retains the last known-good schema and prevents runtime crashes on bad TOML edits.
- HMI Phase 2.1 section layout foundation:
- Added schema-driven section rendering in web HMI (
page.sections) with responsive 12-column spans for sections/widgets. - Added explicit fallback to legacy group card rendering when section metadata is absent, preserving existing trend/alarm/dashboard behavior.
- Added widget renderers for
gauge,sparkline,bar,tank,indicator,toggle, andsliderwith value updates and existinghmi.writeintegration for writable controls. - Added transition/micro-animation behavior for gauge/bar/tank/indicator/toggle updates and dark-mode CSS variable overrides via
prefers-color-scheme: dark. - Added integration coverage for section layout assets, renderer assets, and schema span metadata used by the web renderer.
- HMI Phase 2.4 live transport foundation:
- Added
/ws/hmiwebsocket endpoint in the embedded web server for push updates (hmi.values.delta,hmi.schema.revision,hmi.alarms.event). - Added web HMI client websocket transport with reconnect/backoff and automatic fallback to HTTP polling when websocket is unavailable.
- Added schema live-refresh behavior in the web client to re-fetch full
hmi.schema.getpayloads onschema_revisionevents. - Added integration coverage for websocket event flow and export transport metadata (
/ws/hmiroute +config.ws_route). - Added websocket hardening integration gates for local latency SLO budgets (p95/p99), forced socket-failure polling recovery, and reconnect churn stability.
- HMI Phase 2.5 process-page foundation:
- Added process-page schema support (
kind = "process") with page-level SVG asset and bind metadata (svg,bindings) in runtime HMI contracts. - Added secure SVG asset serving route (
/hmi/assets/<svg>) with path containment checks and SVG-only file restrictions. - Added process bind parsing guardrails for safe selector/attribute usage plus optional
format,map, andscaletransform contracts. - Added web client process renderer path to inline SVG assets and apply live bind updates from HMI value streams.
- Added integration coverage for process schema metadata, asset serving, and negative filtering of unsafe/missing bind selectors.
- HMI Phase 2 completion hardening:
- Added renderer-state regression coverage for all new widget kinds (
gauge,sparkline,bar,tank,indicator,toggle,slider) across null/stale/good value paths. - Added responsive breakpoint regression checks for desktop/tablet/mobile class behavior in the web HMI layout engine.
- Added process asset-pack integrity checks for
hmi/pid-symbols/licensing/library presence, stable IDs inhmi/plant.svgandhmi/plant-minimal.svg, and selector alignment inhmi/plant.bindings.example.toml. - HMI Phase 3 core command/tool surface:
- Added LSP command
trust-lsp.hmiBindingswith workspace-root/file scoping and deterministic bindings catalog payloads (programs,globals) including qualifier/writable metadata and available constraints (unit,min,max,enum_values). - Added VS Code LM tools
trust_hmi_get_bindings,trust_hmi_get_layout, andtrust_hmi_apply_patchwith dry-run conflict reporting for descriptor file operations. - Added VS Code command registrations
trust-lsp.hmi.initandtrust-lsp.hmi.refreshFromDescriptorand integrated refresh invocation from HMI patch application flows. - Added VS Code HMI integration coverage for LM tool valid/invalid payload handling and cancellation behavior.
- HMI Phase 3.6/3.7 completion:
- Added LSP diagnostics for
hmi/*.tomlfiles with stable codes for parse failures, unknown bind paths, type/widget mismatches, and invalid widget property combinations. - Added near-match suggestion hints for unknown binding paths in HMI descriptor diagnostics.
- Added multi-root LM-tool integration coverage to verify explicit
rootPathresolution and write routing fortrust_hmi_apply_patch/trust_hmi_get_layout. - HMI Phase 4 panel refresh foundation:
- Expanded VS Code HMI preview refresh relevance to
hmi/*.tomlandhmi/*.svg. - Added debounced filesystem watching of HMI descriptor/assets (
**/hmi/*.{toml,svg}) so open panels refresh on descriptor edits without forced auto-open behavior. - Added section-aware panel rendering (
page.sections+widget_span) for dashboard pages. - Added process-page panel rendering (
kind = "process") with safe binding updates and localhmi/*.svgasset hydration in VS Code preview. - HMI Phase 5 export bundle foundation:
- Updated
/hmi/export.jsonpayload contract toversion = 2. - Added
config.descriptorto export payloads with the resolved livehmi/descriptor content when present (ornullwhen running legacy/no-descriptor projects). - Added export integration coverage for descriptor-backed bundles and renderer-capability assertions in exported
hmi/app.js. - HMI Phase 6 intent-to-evidence foundation:
- Added VS Code LM tool
trust_hmi_plan_intentto generate/update deterministichmi/_intent.tomlartifacts with operator goals, personas, KPI priorities, and constraints. - Added VS Code LM tool
trust_hmi_trace_capturefor deterministic scenario-tagged API-level runtime trace capture (hmi.schema.get/hmi.values.get) intohmi/_evidence/<run>/trace-<scenario>.json. - Added VS Code LM tool
trust_hmi_generate_candidatesfor scaffold-rules-based deterministic candidate generation and ranking by readability/action-latency/alarm-salience metrics withcandidates.jsonevidence output. - Added VS Code LM tool
trust_hmi_validateto run machine-readable HMI validation checks, emit deterministichmi/_lock.json, and write evidence runs underhmi/_evidence/<timestamp>/. - Added VS Code LM tool
trust_hmi_preview_snapshotto emit deterministic desktop/tablet/mobile snapshot artifacts underhmi/_evidence/<run>/screenshots/. - Added VS Code LM tool
trust_hmi_run_journeyfor API/event-level operator journey execution (no headless browser requirement) with pass/fail timing metrics injourneys.json. - Added VS Code LM tool
trust_hmi_explain_widgetfor widget provenance reporting (canonical ID, symbol/type, write-policy allowlist state, and contract endpoint mapping). - Hardened
trust_hmi_run_journeywith tool-side write guardrails (read-only/disabled/allowlist checks) and machine-readable step codes before issuing runtimehmi.writerequests. - Added validation retention support (
prune+retain_runs, default 10) and evidence pruning behavior intrust_hmi_validate. - Added integration tests covering intent generation, candidate-ranking determinism, trace capture, validation artifact emission, snapshot output, API/event journey execution, unauthorized-write safety handling, evidence retention pruning, lock determinism, and cancellation handling for the full Phase 6 toolset.
- Added runtime hardening regressions for write-cycle budget checks, websocket slow-consumer/backpressure stability, malformed process-SVG resilience, and rapid descriptor file-churn no-deadlock behavior.
- Added default gitignore rule for
hmi/_evidence/artifacts. - Direct Siemens TIA source handoff via export adapters:
trust-runtime plcopen export --target siemensnow emits a Siemens SCL sidecar bundle (<output>.scl/*.scl) alongside PLCopen XML.- Siemens-target export reports now include
siemens_scl_bundle_dirandsiemens_scl_files[]for automation and CI evidence. - Added dedicated Siemens import tutorial with exact TIA path (
External source files->Add new external file->Generate blocks):docs/guides/SIEMENS_TIA_SCL_IMPORT_TUTORIAL.md. - Added runtime + CLI regression coverage for Siemens SCL bundle generation and
PROGRAMtoORGANIZATION_BLOCKconversion. - VS Code PLCopen import workflow:
- Added command
Structured Text: Import PLCopen XML(trust-lsp.plcopen.import) for CLI-backed PLCopen project import from the editor. - Command flow prompts for input XML + target project folder, validates conflict paths, runs
trust-runtime plcopen import --json, and offers quick access to the generated migration report. - Added VS Code integration coverage for success/cancel/conflict/invalid-input paths in
editors/vscode/src/test/suite/plcopen-import.test.ts. - Added explicit import usage docs in
README.md,docs/README.md,editors/vscode/README.md, and PLCopen example READMEs. - Guided example/tutorial expansion:
- Added
examples/README.mdas a structured tutorial index with recommended learning order and setup checklist. - Added
examples/tutorials/12_hmi_pid_process_dashboard/as a full process-HMI tutorial with a runnable PLC model, descriptor-drivenhmi/pages, production-stylekind = "process"SVG bindings, setpoint/deviation/alarm coverage, and step-by-step build/run/customization guidance (including screenshot/GIF capture workflow). - Added a full walkthrough for
examples/filling_line/README.md(run, I/O mapping, expected outcomes, and tuning exercise). - Reworked example READMEs (
plant_demo,memory_marker_counter,siemens_scl_v1,mitsubishi_gxworks3_v1,ethercat_ek1100_elx008_v1,plcopen_xml_st_complete,tutorials) into detailed step-by-step VS Code setup guides. - Added
examples/vendor_library_stubs/as a tutorial for user-provided vendor library stub indexing ([[libraries]]) with Siemens-style sample declarations. - Removed
examples/openplc_interop_v1/(content absorbed intoexamples/plcopen_xml_st_complete/). - Removed
examples/browser_analysis_wasm_spike/(prototype assets moved todocs/internal/prototypes/browser_analysis_wasm_spike/). - OpenPLC Interop v1 deliverable closure:
- Added dedicated OpenPLC migration guide:
docs/guides/OPENPLC_INTEROP_V1.md. - Added OpenPLC fixture and walkthrough coverage inside the PLCopen ST-complete bundle:
examples/plcopen_xml_st_complete/README.mdexamples/plcopen_xml_st_complete/interop/openplc.xml
- Added regression coverage to keep the OpenPLC sample bundle executable in CI:
crates/trust-runtime/tests/plcopen_command.rscrates/trust-runtime/tests/tutorial_examples.rs
- truST Browser Analysis Spike (Deliverable 10):
- Added new browser/WASM analysis adapter crate
crates/trust-wasm-analysis/exposing deterministic diagnostics, hover, and completion APIs for virtual-document analysis. - Added JSON boundary wrapper
WasmAnalysisEnginefor worker/browser transport integration (applyDocumentsJson,diagnosticsJson,hoverJson,completionJson,statusJson). - Added parity + performance regression suite against native analysis in
crates/trust-wasm-analysis/tests/mp010_parity.rs. - Added browser worker host prototype assets and build pipeline:
docs/internal/prototypes/browser_analysis_wasm_spike/scripts/build_browser_analysis_wasm_spike.shscripts/check_mp010_browser_analysis.sh
- Published scope contract and evidence report:
docs/guides/BROWSER_ANALYSIS_WASM_SPIKE.mddocs/reports/browser-analysis-wasm-spike-20260212.md
- EtherCAT Backend v1 (Deliverable 9):
- Added new runtime I/O driver profile:
io.driver = "ethercat"with EtherCrab-backed hardware transport (adapter = "<nic>") and deterministic mock transport mode (adapter = "mock"). - Added module-chain process-image mapping contract for Beckhoff-style digital I/O profiles (
EK1100,EL1008,EL2008) with size-check diagnostics. - Added startup/discovery diagnostics and cycle-time health telemetry (
ok/degraded/faulted) with driver error policy handling. - Added EtherCAT deterministic integration coverage and runtime example project:
crates/trust-runtime/tests/ethercat_driver.rsexamples/ethercat_ek1100_elx008_v1/
- Published EtherCAT backend guide with scope boundaries and compliance checkpoint:
docs/guides/ETHERCAT_BACKEND_V1.md
- Mitsubishi GX Works3 Compatibility v1 (Deliverable 8):
- Added Mitsubishi vendor profile support in LSP tooling (
vendor_profile = "mitsubishi"and aliasgxworks3) for formatting, stdlib selection defaults, and diagnostics rule-pack aliases. - Added native
DIFU/DIFDedge-alias support in semantic/runtime builtins (mapped to IECR_TRIG/F_TRIGbehavior) for normal ST authoring and execution. - Added Mitsubishi GX Works3 example project:
examples/mitsubishi_gxworks3_v1/. - Added compatibility guide with supported subset, incompatibilities, and migration guidance:
docs/guides/MITSUBISHI_GXWORKS3_COMPATIBILITY.md. - Added dedicated regression coverage across HIR semantics, runtime edge behavior, LSP formatting/diagnostics, and example compile tests.
- Multi-vendor Export Adapters v1 (Deliverable 7):
trust-runtime plcopen exportnow supports--target <generic|ab|siemens|schneider>for vendor-targeted interchange artifacts.- Export JSON contract now includes target adapter evidence fields:
target,adapter_report_path,adapter_diagnostics,adapter_manual_steps, andadapter_limitations. - Vendor-target exports now emit deterministic sidecar adapter reports (
<output>.adapter-report.json) and embeddedtrust.exportAdaptermetadata inaddData. - Published target-specific limitations/manual migration steps guide:
docs/guides/PLCOPEN_EXPORT_ADAPTERS_V1.md. - Editor Expansion v1 (Deliverable 6):
- Official Neovim setup pack published with reference
nvim-lspconfigprofile and workflow keymaps:editors/neovim/. - Official Zed setup pack published with reference language-server profile:
editors/zed/. - Editor setup/validation guide published:
docs/guides/EDITOR_SETUP_NEOVIM_ZED.md. - New editor smoke gate script
scripts/check_editor_integration_smoke.shvalidates editor config contracts and runs targeted LSP workflow tests for diagnostics/hover/completion/formatting/definition. - Vendor Library Compatibility Baseline (Deliverable 4):
trust-runtime plcopen importnow applies deterministic vendor-library shim mappings for selected Siemens, Rockwell, Schneider/CODESYS, and Mitsubishi aliases.- Import/migration JSON contracts now include
applied_library_shimswith vendor/source/replacement/occurrence metadata. - Vendor-library compatibility matrix and shim catalog published in
docs/guides/VENDOR_LIBRARY_COMPATIBILITY.md. - Siemens SCL Compatibility v1 (Deliverable 3):
- Siemens-style
#-prefixed local references now parse in expression and statement contexts (includingFORloop control variables). - Siemens SCL compatibility guide published:
docs/guides/SIEMENS_SCL_COMPATIBILITY.md. - Siemens SCL example project added:
examples/siemens_scl_v1/. - Regression coverage added across parser, LSP formatting/diagnostics, and runtime example compile tests.
- PLCopen Interop Hardening (Deliverable 2):
- expanded migration fixture coverage for major ecosystems (
codesys,beckhoff-twincat,siemens-tia,rockwell-studio5000,schneider-ecostruxure) - structured unsupported-node diagnostics in migration reports with code/severity/node/action metadata
- explicit compatibility coverage summary in import/migration reports (
supported_items,partial_items,unsupported_items,support_percent,verdict) - dedicated compatibility/limits guide:
docs/guides/PLCOPEN_INTEROP_COMPATIBILITY.md - Conformance Suite MVP shipped (Deliverable 1):
- deterministic case pack + versioned expected artifacts in
conformance/cases/andconformance/expected/ - coverage for timers (TON/TOF/TP), edges, scan-cycle ordering, init/reset, arithmetic corner cases, and mapped memory behavior
- negative/error-path coverage for runtime overflow behavior and unresolved wildcard mapping compile errors
- external run guide and submission process (
conformance/external-run-guide.md,conformance/submissions.md) - explicit known-gaps register (
conformance/known-gaps.md) trust-runtime conformanceCLI runner mode:- deterministic
case_idordering - machine-readable JSON summary contract (
trust-conformance-v1) - stable failure reason taxonomy (
conformance/failure-taxonomy.md) --update-expectedmode for deterministic artifact refresh- ST unit-testing tutorials:
examples/tutorials/10_unit_testing_101/examples/tutorials/11_unit_testing_102/- Salsa hardening gates and overnight validation scripts/reports:
scripts/salsa_*_gate.shscripts/salsa_overnight_hardening.shdocs/reports/salsa-overnight-hardening-20260209.md- Runtime/UI multi-driver coverage and integration tests for Modbus + MQTT.
- New ST assertion functions in runtime/hir:
ASSERT_NOT_EQUALASSERT_GREATERASSERT_LESSASSERT_GREATER_OR_EQUALASSERT_LESS_OR_EQUALtrust-runtime test --listto discover test names without executing.trust-runtime test --timeout <seconds>for per-test execution timeout.- CLI/integration tests for list/filter/timeout behavior and JSON duration fields.
Changed¶
- Local developer test workflow acceleration:
just testnow usescargo-nextestfor the default local loop (trust-runtimelibrary tests), with automatic fallback tocargo testifnextestis unavailable.- Added split test targets in
justfile:test-integration,test-e2e, andtest-all(full previous gate). - Enabled faster local linking via
mold(.cargo/config.toml) and enabledsccacheas Cargorustc-wrapper. - Reduced dev/test debug symbol level to
debug = 1for faster incremental compile/link during local iteration. - PLCopen CODESYS import hardening:
trust-runtime plcopen importnow maps CODESYS{attribute 'qualified_only'}global variable lists into a compiler-validTYPE + CONFIGURATION/VAR_GLOBALwrapper model instead of emitting unsupported top-levelVAR_GLOBALfiles.- Imported POUs that reference qualified lists (for example
GVL.start) now receive injectedVAR_EXTERNALdeclarations so cross-file global access resolves in trust-lsp/runtime builds. - Imported
FUNCTIONPOUs without explicit result assignment now get a deterministic fallback self-assignment (for exampleMyFunc := MyFunc;) to preventE206 missing return valueon first import. - Demo Pages WASM startup UX now force-updates the
WASM Readybadge after engine readiness resolves, preventing a staleLoading WASM...state when the workerreadyevent arrives before listener registration. - Demo WASM analysis clients now send an internal bootstrap
statusrequest on worker spawn so startup no longer depends on user interaction beforeWASM Readyappears. - Demo Pages now publishes a root
favicon.icoand links it fromdocs/demo/index.html, avoiding browser default/favicon.ico404s. - VS Code statechart extension quality gates now lint TSX sources and run explicit webview TypeScript typechecking (
tsconfig.webview.json) during compile. - Statechart import command flow now consistently resolves source/target paths and reuses shared URI/path helpers across statechart commands.
- Statechart hardware helper scripts/docs now use repository-relative paths and group-based socket permissions (
660) instead of world-writable sockets. - Statechart operator/developer guides and helper script output are now standardized to English for consistent repository documentation language.
- Web IDE visual styling now aligns with the runtime page sidebar theme treatment (surface, spacing, and footer layout) for a consistent
/and/ideexperience. - Web IDE authoring gating no longer depends on runtime
control_mode=debug; editor capability is now enforced via web auth role and IDE session role (viewer/editor) at API boundaries. - Web IDE performance gates were tightened to product targets (completion/hover p95 <= 150ms, diagnostics p95 <= 300ms, workspace search p95 <= 400ms) in automated integration checks.
- Standardized example I/O mapping patterns to use
VAR_CONFIGbindings (instead of direct%I/%Qdeclarations inVAR/VAR_GLOBAL) across communication, EtherCAT, Siemens, Mitsubishi, and unit-testing tutorial projects. - Updated example documentation snippets to reflect
PROGRAMvariables plusCONFIGURATION-levelVAR_CONFIGwiring as the recommended deterministic pattern. - Browser/WASM position mapping now uses UTF-16 column semantics for protocol compatibility in
trust-wasm-analysisrange/position conversions. - HMI scaffold update behavior now skips regenerating default
process.tomlwhen curated custom process pages already exist, and skips creating emptycontrol.tomlwhen no writable points are discovered. - HMI auto-schematic Process scaffold now enforces deterministic grid/anchor rules (shared FIT/PT instrument template geometry, value offset one grid row above sensor centerline, stems snapped to process line, connector-anchored routing) and level-fill bindings now update both
yandheightfor percent-consistent tank visuals. - Tutorial
12_hmi_pid_process_dashboardnow uses grid-aligned P&ID SVG layouts (hiddenpid-layout-guideslayer) with compact overview inventory widgets and cleaned page set (no duplicate scaffoldProcesspage / emptyControlpage). - Tutorial
12_hmi_pid_process_dashboardProcess/Bypass P&ID pages now use denser operator layout (integrated status rail, calibrated tank scales, stronger typography hierarchy, and ISA-style symbol/line cleanup) with synchronized level-fill scaling. - Tutorial
12_hmi_pid_process_dashboardProcess/Bypass P&ID pages now remove duplicated PV summary strip and fix tank header text overlap while keeping tank fill scaling aligned to visible geometry. - Tutorial
12_hmi_pid_process_dashboardProcess/Bypass P&ID pages now render pipe runs without the extra lane background panel. - Added grouped communication examples under
examples/communication/for Modbus/TCP, MQTT, OPC UA, EtherCAT, GPIO, and composed multi-driver setups, and documented protocol transport gates (includingethercat-wireunix hardware scope andopcua-wirerequirement) in examples/tutorial indexes and guide docs (PLC_IO_BINDING_GUIDE.md,PLC_NETWORKING.md,PLC_DEVELOPER_GUIDE.md). - Restored the field-tested EtherCAT
EK1100 + EL2008profile asexamples/communication/ethercat_field_validated_es/(Spanish operator-focused commissioning walkthrough) so communication examples now include two EtherCAT tracks. - Added automated runtime CLI regression coverage for grouped communication examples via
crates/trust-runtime/tests/communication_examples_cli.rs, verifyingbuild --sources srcandvalidateformodbus_tcp,mqtt,opcua,ethercat,gpio, andmulti_driverin CI/test runs. - Added advanced operations tutorial
23_observability_historian_prometheusand expanded16_secure_remote_accesswith explicit TLS commissioning/validation steps so observability and remote-hardening flows are covered end-to-end in the examples track. - CI release-gate aggregation now includes a dedicated
Editor Expansion Smokegate for Neovim/Zed integration coverage. - PLCopen XML Full ST Project Coverage (Deliverable 5):
- Profile advanced to
trust-st-complete-v1. trust-runtime plcopen importnow supports full ST-project model import for:types/dataTypes(elementary,derived,array,struct,enum,subrange)instances/configurations/resources/tasks/program instances
trust-runtime plcopen exportnow emits supported STTYPEdeclarations and configuration/resource/task/program-instance model back into PLCopen XML.- Import/export JSON contracts now include deterministic ST-project coverage counters:
data_type_count,configuration_count,resource_count,task_count,program_instance_count(export)imported_data_types,discovered_configurations,imported_configurations,imported_resources,imported_tasks,imported_program_instances(import/migration)
- Added CODESYS ST-complete fixture packs (
small/medium/large) with deterministic expected migration artifacts and CI schema-drift parity gate incrates/trust-runtime/tests/plcopen_st_complete_parity.rs. - Updated PLCopen compatibility/spec docs and added end-to-end import/export example project in
examples/plcopen_xml_st_complete/. - Project source layout is now
src/only across runtime/CLI flows: trust-runtime build,test,docs, andrun --projectnow require<project>/srcas the default source root.- Legacy
<project>/sourcesfallback resolution was removed from bundle/project source lookup. - Setup/wizard-generated projects and shipped tutorials/examples now use
src/consistently. - PLCopen import/export project-root resolution now targets
src/only. trust-runtime setupauto-migrates an existing<project>/sourcesfolder to<project>/srcwhen preparing a project.trust-runtime build --sources <relative-path>now resolves relative source overrides from--project, avoiding path-resolution mismatches from external working directories.trust-runtime plcopen exportandtrust-runtime plcopen importnow support--jsonfor machine-readable report output.trust-runtime plcopen profilenow publishes a compatibility matrix plus round-trip limits/known-gaps contract fields.trust-runtime plcopen importcompatibility scoring now accounts for shimmed vendor-library aliases as partial-coverage items.- PLCopen ecosystem detection now recognizes Mitsubishi GX Works markers (
mitsubishi-gxworks3) for migration reporting/shim selection. - PLCopen ecosystem detection now recognizes OpenPLC markers (
openplc) for migration reporting/shim selection, with OpenPLC fixture-backed regression coverage. - PLCopen vendor-library shim matching now also normalizes keyword-style vendor aliases (for example
R_EDGE) when used in supported type/call positions. - Migrated
trust-hirsemantic path to Salsa-only backend and upgraded Salsa to0.26. - Enabled VS Code extension integration tests in CI under virtual display (
xvfb). - Expanded cancellation checks in workspace-scale LSP operations.
- CI now includes a dedicated conformance gate with repeated-run deterministic comparison.
- VS Code extension marketplace metadata now declares dual-license SPDX (
MIT OR Apache-2.0) and monorepo repository directory (editors/vscode). - Documentation organization:
- Public durable reports remain in
docs/reports/. - Working remediation checklists are no longer published in
docs/reports/. trust-runtime testoutput now reports per-test elapsed time and total elapsed time in human output.trust-runtime test --output jsonnow includesduration_msper test and in summary.- Tutorial 10/11 docs updated for list/timeout usage and expanded assertion coverage.
Fixed¶
- VS Code SFC webview TypeScript message/edge typing regressions that previously failed extension compile gates in CI.
- Standalone Web IDE bootstrap now serves fully composed split module assets (
ide-editor-language,ide-editor-pane,ide-workspace-tree,ide-workspace-files,ide-observability,ide-commands) so session startup/open-project flows no longer fail with missing runtime symbols (for examplerefreshProjectSelection). - Standalone Web IDE bootstrap no longer stalls waiting for WASM analysis readiness when the analysis worker repeatedly restarts; IDE startup now completes and remains usable with analysis disabled.
- Web IDE UI-mode detection now accepts both wrapped (
{ok,result}) and direct ({ok,mode}) API payloads, restoring correct standalone-mode behavior (for example disabling runtime-only controls instandalone-idemode). - Web IDE Hardware tab now rehydrates after IDE session bootstrap events (including deep-link startup on
/ide/hardware) and performs delayed canvas relayout/fit passes after tab activation so hardware + communication modules fromio.toml/runtime.tomlreliably render without clipped/off-screen graphs. - Web IDE workspace tabs now publish explicit ARIA tab semantics (
tablist/tab/tabpanel,aria-selected, and active-tabtabindexmanagement) for keyboard/screen-reader correctness. - Config-UI Fleet topology projection no longer reports planned runtimes/endpoints as online by default;
/api/runtime-cloud/statein config mode now renders offline/degraded runtime state and failed links until live runtime connectivity exists. - Config-UI now serves read-only
/api/runtime-cloud/configand/api/runtime-cloud/rolloutssnapshots in offline mode to prevent Web UI polling 404 noise during TOML/ST-only editing sessions. - Runtime cloud 5-host topology demo is now self-contained and deterministic:
start-5.shauto-bootstraps missing projects, performs clean restarts, waits for runtime-cloud readiness, and ships explicit mesh/link-transport seed data for mixedrealtime/zenohtopology behavior. - Fleet/Comms add-driver deep-link handling now preserves unknown preselected driver types instead of silently falling back to
modbus-tcp. - Fleet/Comms schema-number handling now preserves valid
0values (for example Modbusunit_id = 0) and enforces min/max validation before save. - Fleet topology device context menu now resolves touch coordinates reliably (long-press/taphold) and always unregisters its outside-click dismissal listener on close.
- VS Code statechart custom editor packaging now loads the webview template from bundled extension code instead of
src/**runtime paths excluded by.vscodeignore. - VS Code statechart editor lifecycle now stops active execution sessions when the panel closes, ensuring timers/runtime connections are cleaned up.
- State machine engine transition execution now awaits exit/transition/entry hardware actions before completing transitions.
- Hardware-mode guard handling now fails closed on parse/read/runtime errors instead of allowing unsafe transitions.
- Runtime control client request timeout/error handling now removes per-request listeners reliably to prevent listener leaks.
- Statechart traffic-light example now starts from a valid non-dead initial state (
Red). - Web IDE hover behavior now follows VS Code semantics by relying on Monaco hover tooltips; the redundant Output-side Hover panel was removed to prevent duplicate/stale hover text.
- Web IDE hover provider failures are now logged as
[ide] hover failed:in browser console output to improve diagnostics when hover requests fail. - Web IDE analysis cache refresh now skips unrelated unreadable/oversized
.stfiles so hover/completion keep working for the active source, Monaco hover/suggest widgets now use overflow-safe rendering to avoid hidden popups, and/ideassets are served withCache-Control: no-storeso browser refreshes pick up the latest IDE fixes. - Web IDE hover/completion hardening now normalizes Monaco hover content payloads, falls back to local symbol suggestions when completion analysis is unavailable, and debounces hover popup triggering on mouse idle so behavior matches VS Code more closely on Chromium-based runtime kiosks.
- Browser analysis worker-recovery CI gate now includes the Node test fixture file (
docs/internal/prototypes/browser_analysis_wasm_spike/web/analysis-client.test.mjs) in tracked repository contents, fixing missing-file failures on GitHub runners. - GitHub Pages demo language features are now strict WASM/LSP-only (no local fallback synthesis), completion request flow is hardened via deduplicated document sync and longer WASM request budgets for slower devices, and FB hover signatures now recover declared member type text from source when semantic type IDs are unresolved.
- Browser WASM completion ranking now prioritizes typed-prefix matches before result limiting, and completion context recovery now keeps in-scope program variables available during parser recovery edits (fixing missing
Status/Pumpsuggestions in the demo). - Browser IDE/WASM LSP navigation for structured type fields is now project-wide:
Go to Definition,Go to References, and rename now resolveSTRUCT/UNIONmembers across files (fixingNo definition/references foundon demo symbols likeEnable,ActualSpeed, andramp). - GitHub Pages demo rename wiring now consumes WASM rename edits directly, restoring
F2rename in Monaco, and walkthrough instructions now match the exact Monaco UI labels/actions (Ctrl+Left-click,Go to References,Fn+F2note for laptops). - GitHub Pages demo LSP request handling is now resilient on slower browser hosts: WASM timeouts were raised for diagnostics/navigation/rename/completion, Monaco cursor boundary fallback now retries nearby symbol offsets for strict WASM requests, URI mapping accepts normalized location schemes, and diagnostics walkthrough text now reflects a clean-by-default project (use a temporary typo to demonstrate squiggles).
- GitHub Pages demo strict-WASM LSP cursor anchoring is now delimiter-aware (
.,#,:boundaries): completion/definition/references/rename retry nearby identifier edges, context-menu requests set the cursor to the clicked symbol, and rename preflight resolves identifier ranges from the same fallback matrix. - Browser analysis worker-recovery checks now also run demo cursor-position fallback regressions (
docs/demo/lsp-position-resolver.test.mjs) and no longer fail hard when the legacy prototype test fixture path is absent. - GitHub Pages demo walkthrough actions are now deterministic and WASM-only for investor flow: steps 1-7 target the correct symbols/files,
Shift+F12andF2are triggered through Monaco actions, cross-file navigation opens in-editor via a registered Monaco editor opener, and bundled Monaco now includes the required references/rename contributions to keep references/rename/go-to-definition working in Pages builds. - Added local GitHub Pages replica serving for the demo (
scripts/serve_demo_local_replica.py,scripts/run_demo_local_replica.sh) with/<repo>/routing and no-cache headers so local behavior matches deployed Pages URLs. - IDE symbol-target resolution now anchors token/scope lookup to the resolved identifier range (not raw punctuation cursor token), fixing
Go to Definition, references, and rename misses when the cursor lands on adjacent punctuation in demo/editor workflows. - GitHub Pages demo release packaging now rebuilds and ships refreshed
docs/demo/wasm/artifacts from the currenttrust-wasm-analysisengine so deployed Pages behavior matches committed source fixes. - VS Code extension project workflows now follow
src/-based projects consistently: ST test run root detection acceptssrc, PLCopen export integration coverage usessrc, and new-project scaffolding no longer generates legacysources/. - CI Windows build no longer fails on missing
wpcap.libwhenethercat-wireis enabled by default; EtherCAT wire dependency wiring is now unix-target gated while preserving mock-driver support cross-platform. - MP-001 parity baseline updated for newly added Mitsubishi LSP regression tests so discovery parity gate remains deterministic.
- Parser diagnostics now report a targeted error (
expected identifier after '#') for malformed Siemens SCL#local-reference syntax instead of generic expression errors. - Schneider EcoStruxure vendor detection is now distinct from generic CODESYS-family heuristics in PLCopen migration reports.
- GitHub license detection no longer reports an extra
Unknownlicense entry after removing the non-standard rootLICENSEstub (dual-license files remainLICENSE-MITandLICENSE-APACHE). - Release packaging metadata:
- VS Code extension package versions are now aligned to the workspace release version to avoid duplicate publish artifacts from prior extension versions.
- Release workflow hardening:
- VS Code Marketplace publish now runs per-VSIX with retry/backoff on transient network timeouts and treats already-published artifacts as idempotent success for reruns.
- VS Code Marketplace screenshots now use absolute image URLs from GitHub raw content so images render reliably in extension listing pages.
trust-runtime validateno longer reports falseundefined programerrors for valid bundles; it now validates decoded bytecode/module metadata directly and enforces task-program name integrity at bytecode-validation time.- Bytecode encoding/validation now handles enum-typed constant payloads correctly during module build/validation.
%MWmemory marker force/write synchronization in runtime I/O panel flow.- Debug adapter force latch behavior and state-lock interaction.
- Debug runner now respects configured task interval pacing.
- Windows CI/test path issues (
PathBufimport and path hygiene guardrails). Harness::run_untilnow has a default cycle guard and explicitrun_until_maxlimit to prevent hangs.- Filtered test runs now clearly report when zero tests match but tests were discovered.
version-release-guardnow tolerates short ordering races betweenmainand tag pushes by polling for the expected version tag before failing.