enhancement
major
#29993
Configuration: Each configured function can be implemented in either Java or TL-Script, using the same configuration syntax (including in the React configuration editor)
#30000
Design System UI pass, part 1: one selection form; surface-interactive-selected becomes surface-interactive-strong
#30006
Engine Extensions for the Tax Application: writable secret storage in the database, application context path in development mode (tl.contextPath), and instance search by attribute value
#30025
React UI: Hide commands and units for which the logged-in user does not have the required role on any object
#30031
The database does not enforce uniqueness of reference values without duplicates: a unique index on the link tables, separate link tables for bags
#30041
Self-service accounts: invitations expire and record their acceptance, invitations can be accepted and managed in the React UI, localized mail templates
#30045
View layer slots: report a <slot-content> that reaches no <slot>, empty fallback of a <slot>, slot positions in split panels and the sidebar
#30053
Agent runs: bound the pool of parallel tool calls (AgentLoop.TOOL_WORKERS) and tell a user whose chat message waits for a free worker
#30057
Administration of the React UI: scheduler (task list, run now, stop, activate/deactivate, cluster lock, run history) with one unified active/inactive switch per task
#30058
Administration of the React UI: memory trend chart (memory use over time incl. garbage collection) and the remaining monitoring views of the classic UI
#30059
Administration of the React UI: maintenance functions of the classic maintenance pages (database export/import/history compaction, SQL console, reload, search index, security storage, encryption)
#30064
Administration of the React UI: login messages (messages shown at login, with their validity)
#30065
React Interface: Workflow Administration with BPMN Editor, Step Views from the View Designer, and Task Editing (BPE)
#30066
React Administration: View and Explain an Account's Effective Permissions on an Object (Role Inspector)
#30074
React Interface: Signing In with Passkeys (WebAuthn) — passwordless or as a second factor alongside TOTP; managing your own passkeys in the settings
#30075
Log View (React UI): Display the details of an entry (stack trace) in a dialog in a readable format
#30076
React Interface: Password change with confirmation message and validation before the identity prompt; protection against brute-force attacks on passwords and one-time codes
#30081
TL Views: Change Authenticator App (New TOTP Secret), Reset Two-Factor Authentication by Administrator
#30086
XML import: <update> of <unless-known> must restate the structure of the descendants it updates
#30088
View layer: document how a ChannelSource keeps a monitor running while its view is hidden and ends it with the window
#30097
Generate JavaScript libraries (umljs, ace, require.js, bpmn-js) in the Maven build instead of checking them in; update bpmn-js to version 18
#30104
Nightly preview builds of the engine with a fixed Maven version and a changelog instead of a rolling SNAPSHOT
#30108
pac4j Registration: The account mapping receives the identity provider's full identity (subject, claims) rather than just a login name
#30126
tl-chat: Chat actions run as React commands within the window rather than via a separate ChatServlet; the chat's proxy workaround is no longer used in favor of engine polling
#30132
View layer: value listeners of the model (<value-listeners>) react to field changes in the React form, through a UI-independent listener contract
#30151
React View Layer: Commands Without HandlerResult - View commands report errors as exceptions; React command handlers return their response as a msgbuf message
#30157
React Interface: Insert images into the HTML editor using Ctrl+V and drag-and-drop; resize using handles; never wider than the content
#30160
Adding Albert to an application: shipped React chat page, how-to article and archetype defaults
#30163
SQLFactory: Generate column changes (modifyColumnName/Type/Mandatory) only with a complete column definition
#30167
Remove database defaults for columns: Add required columns using "create, populate, set as required"
#30179
An application generated with useSSO=true offers the generic OpenID login, switched on by the tl_pac_* environment variables, also on the development server
#30190
Remove the control application tl-factory from the engine, it is developed in its own repository
#30200
Agent Access and Recording: Commands operate on stable object IDs; technical keys are used only for recording and playback
#30223
Self-service mails: texts editable in the service configuration, language of an invitation selectable
#30225
Model: handlers declared on an attribute (change) or a type (creation, deletion), run within the commit
#30250
TL Views: <start-job> / <job-status> - close button for an ended job, point of no return, partial result of a cancelled job, closing the dialog from the follow-up, follow-up sees the job's commits
#30253
tl-ai-core pulls the Playwright browsers (driver-bundle, 200 MB) into every application: browser tools move into the optional module tl-ai-browser
#30266
React Configuration Editor: Multi-line text (HTML, Markdown, code, multi-line) uses the entire line by default
minor
defect
critical
#30146
Data migration is not protected against parallel execution when multiple cluster nodes are started simultaneously
major
#29847
Scripted test TestTransactionMonitor-01_RevertRevision fails when a scheduled task commits concurrently
#30043
TL Views: a value the server sets while the React rich-text editor has the focus is never applied; the composer keeps its text after sending
#30067
React Interface: Logging in in one browser tab immediately logs you out if a second tab for the application is open
#30077
TL Views: Wizard—re-entering an "Auto-Next" step without a separate navigation path leaves the user with no way to return to the workflow
#30078
React Interface: When setting up two-factor authentication, the key for manual entry is not displayed; only the QR code is shown.
#30082
React UI: Tabs in a dialog change the page's address and remain in the URL after the dialog is closed
#30090
Scheduler: A task that is due at startup is detached during shutdown while it is still running (NullPointerException in TaskImpl.getLog())
#30099
Scheduler tests: testStartTaskImmediately and testPeriodically have occasionally timed out since the scheduler was revised
#30103
tl-maven-plugin: If merging the view overlays fails during application build, the build remains green
#30106
tl-chat: Commands at the top of a data-list do not display their status (hidden, disabled with reason); clicking on a locked command produces no response
#30107
tl-maven-plugin: If generating a layout fails during application build, the build remains green
#30109
tl-chat: After logging in, the chat in the same browser window remains at "Log in to use the chat"
#30118
Passkeys per application can be used either for password-less login or as a second factor, but not both at the same time
#30124
OpenAPI Server: The error message for a failed script is unreadable and is generated outside the interaction context
#30125
Agent access: /agent-api answers a request without a valid credential with a redirect to the login page instead of 401
#30127
An application at the server root keeps its session: the session cookie is sent to all its paths, and the React page announces its icon
#30128
A run without provider credentials ends as an authentication failure, and HTTP 402 is a billing failure for every provider
#30133
View layer: a field mandatory by dynamic visibility loses its required marker on a validation change
#30143
TL Chat: While an agent is performing multiple steps, their last message remains visible, and the status bar displays the current step instead of just showing "…" and "Working on …"
#30147
React Interface: The "More Actions" menu does not close when the Escape key is pressed if all items are disabled
#30159
React UI Script Recorder: Recordings of tree, multiple-selection, and dropdown assertions can be replayed in a different session
#30164
TL Chat: A run that fails with an exception leaves no error in the conversation; it is gone after a reload
#30165
React: A command with ignoreStaleUi to a control that left the display still fails with 404 "Control not found"
#30166
TL Chat: runPageCommand gives the model the refusal of a page command in English instead of the user's language
#30173
OIDC login button is offered although the client has neither discovery URI nor provider metadata
#30177
The development server ignores X-Forwarded-* headers, so a relative callback URL behind a proxy names the wrong origin
#30201
Commit veto of the model constraints: a failed job (and its log) shows only "Cannot store, constraints violated." without the problems
#30216
Background processing fails with the error "Session revision invalid" if the window saves data while it is running (jobs, AI runs)
#30251
tl-ai-core, Anthropic provider: Claude 5.5 models missing from the bundled model catalog, and claude-haiku-5-5 sent a thinking budget (HTTP 400)
#30252
tl-ai-mcp-server: tools/list is not filtered by the caller's tool access, and /mcp/ with a trailing slash answers 404
minor
#29961
React applications include modules from the classic interface (self-service, WYSIWYG editor, code editor, search, monitoring, AI administration)
#30044
TL Views: a sidebar separator stays visible when every item after it is hidden; the anonymous session sees the system separator with nothing below it
#30085
Default values <country value="..."/> and <time-zone value="..."/> (CountryDefaultProvider, TimeZoneDefaultProvider) cannot be used
#30089
The TL script functions `binarySize()` and `modelHealthReset()` return integers instead of doubles and log an error on every call
#30134
View layer: <composition-table> ignores the visibility (dynamic-visibility, hidden, read-only) of its composite attribute
#30140
TL Views: TestViewsLoad does not detect an undefined variable in a computed-column's value expression
#30142
CommaSeparatedStringSet: Non-deterministic serialization creates duplicate key attributes in the schema baseline
#30181
Flowchart (Gantt): The chart is always displayed in full—no vertical scrolling, but it becomes unreadable when there are many rows
#30185
Flowchart (Gantt): LineDeco labels (e.g., “Today”) are cut off beneath fixed headers; edges without arrowheads
#30191
Module shutdown stops no module at all if the class of its InContext job cannot be loaded (database stays open in the container's JVM)
#30198
React Views: Tree Table ({{{<tree-table>}}}) without row editing ({{{row-edit}}}) – not a replacement for the classic tree grid
#30199
React-Views: When a constraint is violated, the editable table displays only a red border, not an error message
#30204
React Table: When there are multiple row types, attribute columns are resolved only for the first type (label, sorting, filter)
#30205
React Table with Row Edit: A column based on a derived attribute is editable, but saving fails
#30206
React: A disabled `upload-command` does not display a reason; `null-input-disabled` always disables it
#30211
React: The built-in rules for `delete-object` and similar take precedence over the configured ones (making `visible-if` ineffective)
#30213
Binary attribute: Querying the content type loads the entire content; BLOB columns in object tables are loaded only for small values
#30214
View layer: tooltips drop the line breaks of their text (.tl-tooltip__body has white-space: normal)
#30256
React-UI: Set the color role of a row, cell, or view as a separate script (row-role, cell-role, role) instead of the ineffective status classes tl-status-*
#30258
React-UI: The only way to display tabs for a single type is by using a type deviation in `access-control`, and that is logged as a WARN.
#30259
KB: Committable.rollback() is called after a successful database commit if the changes or caches fail to be published
defect
minor
#30257
React-UI: Commands from a window in a detached session generate two WARN lines per command
Background
Users often have the application open in multiple tabs of the same browser. All tabs share the session cookie. If you log in or out in one tab, the windows in the other tabs will belong to a session that no longer exists. This is normal behavior. The log should remain quiet so that genuine warnings stand out.
Problem
After the session changes, the other tabs continue to send commands from their controls (e.g., scroll, reportDisplayClass). The server logs two WARN lines for each command:
WARN ReactWindowReplay - No SubSession found for window 've5a47d116650f4f0'. The view page may not have been loaded yet. WARN ReactServlet - Command 'scroll' for control 'v104' targets unknown window 've5a47d116650f4f0'. Known windows: [v040cfa340da141ef, v2f3709f60c4a01c7]
- The client recovers on its own: The tab reloads (tlReactStaleUiReloadTime in sessionStorage) and then displays the new session.
- What remains is the noise in the log: about 4 to 16 WARN lines each time a user logs in or out with a second open tab, and the same number for each open window after a server restart.
- This is not a bug in the application. However, you can’t tell that from the log entries, so you end up checking them every time.
Version: 8.0.0-alpha12, React View Layer (tl-layout-react).
Reproduction
- Open the application in two tabs of the same browser, logged in to both.
- In Tab A, log out and log back in (even as a different user).
- Do not touch Tab B; it sends its next commands (e.g., after scrolling or when rendering) using its old window name.
- The log shows the two WARN lines at the top for each command. The window name is that of Tab B (window.name), not that of the tab in which you are logged in.
Example from an application (Prime): Acceptance of Stage 6c, with a second tab open showing the project overview; each login and logout in the first tab generated the lines.
Expected Behavior
- A command for a window belonging to a terminated or expired session is logged as INFO or DEBUG, at most once per window.
- WARN is reserved for cases that indicate an error, such as an unknown window in a running session that never existed there.
Solution
- A request for a window that does not display a page in the session is always a normal process for the server: a detached or expired session, a server restart, or a window that was closed after leaving the page (e.g., returning from the back-forward cache). In all cases, the client recovers on its own (stale-ui → reload). The server cannot distinguish a window that has never existed in the current session from these cases: the client generates window names, and the server no longer knows the windows of a terminated session. Therefore, there is no separate WARN level for this.
- ReactWindowReplay.installSubSession no longer logs; the call runs for every access (command, SSE, poll, I18N, agent) before it is determined whether the window is missing.
- ReactWindowRegistry.reportStaleWindow(windowName, request) reports such requests to a central location: the first one per window name and session is reported at the INFO level, while each subsequent one and the list of known windows are reported only at the DEBUG level. If the window displays a page again, it is reported once more at the INFO level when it becomes stale again. The number of reported names is limited to 64.
- Report the following through this mechanism: commands sent to an unknown window and to a window without controls (page unloaded, window waiting to be reloaded, or never rendered), SSE connections, and poll requests for an unknown window.
- Status codes and client recovery remain unchanged.