Changelog¶
This page renders the repository changelog directly so release notes stay inside the searchable docs surface.
Repository Changelog¶
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]¶
Target release: v0.22.1
Added¶
-
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-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¶
- 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 and workspace-shell captures stop 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.