From d310f0adfad91bde14de56b247e2c1f4033351ff Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 20:02:33 +0000 Subject: [PATCH 1/2] Update the dev tooling (abaplint 2.120.73, OpenUI5 1.153.0, playwright-core 1.64.0, express 5.3.0) The UI5 SPA leg gives the same result on OpenUI5 1.153.0 as on 1.144.0 against the abap2UI5 commit CI pins (76 pass, the one recorded deviation portable.box-details, 4 skips); RESULTS.md names the version. @abaplint/transpiler-cli stays on 2.13.93, the version @abap2ui5/node-runtime 1.146.0 records for its runtime - the conformance apps are transpiled against it. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Te3BRpRpxNhZAYnrQL6Gdt --- conformance/RESULTS.md | 2 +- package-lock.json | 134 +++++++++++++++-------------------------- package.json | 8 +-- 3 files changed, 53 insertions(+), 91 deletions(-) diff --git a/conformance/RESULTS.md b/conformance/RESULTS.md index e49f641..76bedcf 100644 --- a/conformance/RESULTS.md +++ b/conformance/RESULTS.md @@ -126,7 +126,7 @@ perform. | Frontend | Version | Profile | Pass | Fail | Warn | Skip | Verdict | |---|---|---|---:|---:|---:|---:|---| -| UI5 SPA (`ui5`) | abap2UI5 1.146.0 `b812079` `app/webapp` (identical at main `5d7e91f`, which CI pins), OpenUI5 1.144.0 (npm), Chromium 141 | ui5 | 76 | 1 | 0 | 4 | one MUST deviation: `portable.box-details` | +| UI5 SPA (`ui5`) | abap2UI5 1.146.0 `b812079` `app/webapp` (identical at main `5d7e91f`, which CI pins), OpenUI5 1.153.0 (npm), Chromium 141 | ui5 | 76 | 1 | 0 | 4 | one MUST deviation: `portable.box-details` | | agent client (`agent`) | abap2UI5/mcp-server `lib/appclient.mjs` @ `a4d9f07` (main, PR #44; vendored) | semantic | 61 | 0 | 0 | 20 | conformant (semantic) - the five MUST deviations of `ea4e9fa` fixed | | Adaptive Cards renderer (`adaptive-cards`) | [`renderers/adaptive-cards/`](../renderers/adaptive-cards/README.md) of this repository (prototype), Adaptive Cards 1.5 | portable | 66 | 0 | 0 | 15 | every check it can be driven through holds | | terminal renderer (`terminal`) | [`renderers/terminal/`](../renderers/terminal/README.md) of this repository, driven with keys through its state machine | portable | 72 | 0 | 0 | 9 | every check it can be driven through holds, the router checks included | diff --git a/package-lock.json b/package-lock.json index 5011a6a..73e76ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,12 @@ }, "devDependencies": { "@abap2ui5/node-runtime": "1.146.0", - "@abaplint/cli": "2.120.60", + "@abaplint/cli": "2.120.73", "@abaplint/transpiler-cli": "2.13.93", - "@openui5/sap.m": "1.144.0", + "@openui5/sap.m": "1.153.0", "ajv": "8.20.0", - "express": "5.2.1", - "playwright-core": "1.56.1" + "express": "5.3.0", + "playwright-core": "1.64.0" }, "engines": { "node": ">=22" @@ -51,9 +51,9 @@ } }, "node_modules/@abaplint/cli": { - "version": "2.120.60", - "resolved": "https://registry.npmjs.org/@abaplint/cli/-/cli-2.120.60.tgz", - "integrity": "sha512-GohYyKD6BTIiGuFQGCYgiDTt/1Uw39E4OtwXNiDSt/U+9mrT4Cfy3tvqfe3cHJPStrYjourHm9GW99arVtvDDw==", + "version": "2.120.73", + "resolved": "https://registry.npmjs.org/@abaplint/cli/-/cli-2.120.73.tgz", + "integrity": "sha512-/CxPAfc3noOvPiJX+GB99st8aN/TB5KmMVfrFDrPKrMuIlzRTv1+Yxs0QIgTj8taUNTZGdyBPriR3mHATZmlpQ==", "dev": true, "license": "MIT", "bin": { @@ -103,42 +103,42 @@ } }, "node_modules/@openui5/sap.m": { - "version": "1.144.0", - "resolved": "https://registry.npmjs.org/@openui5/sap.m/-/sap.m-1.144.0.tgz", - "integrity": "sha512-R1HwWJhM5k4TDttYA8wZqcPoZyNp8OiOgWvvAQH8/xzHnkP8m1Cam29V2HOHQ+Wa62R5tQpgBnKPwYSlIsfcbA==", + "version": "1.153.0", + "resolved": "https://registry.npmjs.org/@openui5/sap.m/-/sap.m-1.153.0.tgz", + "integrity": "sha512-afDAICMYaBBTGyjakB4tbWNSFW+4b6uyJubmUzoQIeZl0LqpH6Pf73XEUxz4NBCiNd8QSNiR7En7n3l5vvkD3w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@openui5/sap.ui.core": "1.144.0", - "@openui5/sap.ui.layout": "1.144.0", - "@openui5/sap.ui.unified": "1.144.0" + "@openui5/sap.ui.core": "1.153.0", + "@openui5/sap.ui.layout": "1.153.0", + "@openui5/sap.ui.unified": "1.153.0" } }, "node_modules/@openui5/sap.ui.core": { - "version": "1.144.0", - "resolved": "https://registry.npmjs.org/@openui5/sap.ui.core/-/sap.ui.core-1.144.0.tgz", - "integrity": "sha512-oiDNKuhvc4oL1wyd5ZZbnF3YzHBVeGkIIznBqXdemS3xzmb2a/hHqhuhlrEDD3PxBKctB9uXxUaZbD9paT8zOg==", + "version": "1.153.0", + "resolved": "https://registry.npmjs.org/@openui5/sap.ui.core/-/sap.ui.core-1.153.0.tgz", + "integrity": "sha512-kJQLIqfDCURHSNpUTJBgDEVCuH31FmXyc8xDvV/JwATQgyJGKMp3t1KIeUyLaOfSh5ux+iA7vHznSPZ0DVsNsA==", "dev": true, "license": "Apache-2.0" }, "node_modules/@openui5/sap.ui.layout": { - "version": "1.144.0", - "resolved": "https://registry.npmjs.org/@openui5/sap.ui.layout/-/sap.ui.layout-1.144.0.tgz", - "integrity": "sha512-KPtYvKadj58yHnN/Jdjb8eMrrwC0ogAqsuqTVtrORricLnmhIW45VaMUBITtpBthtK7e8x9L8Z1uJh6D0JDpGQ==", + "version": "1.153.0", + "resolved": "https://registry.npmjs.org/@openui5/sap.ui.layout/-/sap.ui.layout-1.153.0.tgz", + "integrity": "sha512-u4nVCwbl3Xq8EGShHyUqMj/Th9B6k7Vl50kNfz+YCsEnbnk0J3zZrzuHthCB2tyu8Y2RGVaMaNqMr0h/V6qN2w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@openui5/sap.ui.core": "1.144.0" + "@openui5/sap.ui.core": "1.153.0" } }, "node_modules/@openui5/sap.ui.unified": { - "version": "1.144.0", - "resolved": "https://registry.npmjs.org/@openui5/sap.ui.unified/-/sap.ui.unified-1.144.0.tgz", - "integrity": "sha512-oeu3j8uypHf9gL8aPdHZlGI5BpQ98BG59bY/1u3S49IOb+fvJmVfOgwvwkjwUHuaJz9D41p0n520FgZEuliQpg==", + "version": "1.153.0", + "resolved": "https://registry.npmjs.org/@openui5/sap.ui.unified/-/sap.ui.unified-1.153.0.tgz", + "integrity": "sha512-m0J4zy2m7IdbTYH7U3Ce1HQ3IC0SonP2Pq6V5K1cw5m3Rur8Jc9VU7RioGHbLA1TJJYrJmhiGw3Ad9KiBROvKw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@openui5/sap.ui.core": "1.144.0" + "@openui5/sap.ui.core": "1.153.0" } }, "node_modules/accepts": { @@ -197,20 +197,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -253,9 +239,9 @@ } }, "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-2.0.1.tgz", + "integrity": "sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==", "dev": true, "license": "MIT", "engines": { @@ -267,13 +253,17 @@ } }, "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", + "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/cookie": { @@ -407,16 +397,16 @@ } }, "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.3.0.tgz", + "integrity": "sha512-qCqy1xSoaugxOD4IVHb1ZWdkvCF2W3aE2okKouWj8VwJ+ztskSiXoBnCSJqfKT+cVPJhuJqe9YLbY425+Zh00g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", + "body-parser": "^2.3.0", + "content-disposition": "^2.0.1", + "content-type": "^2.0.0", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", @@ -432,14 +422,14 @@ "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", + "proxy-addr": "^2.0.8", + "qs": "^6.16.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", - "type-is": "^2.0.1", + "type-is": "^2.1.0", "vary": "^1.1.2" }, "engines": { @@ -761,20 +751,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/negotiator/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -833,16 +809,16 @@ } }, "node_modules/playwright-core": { - "version": "1.56.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", - "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.64.0.tgz", + "integrity": "sha512-T9r+MZkTECl2+oUcZ26YgZzTrYidTsIhYYkJix+6iDOymOb1FB2RLLSOxRGnZGv5DStt+aduIVbt+E8WygXYpg==", "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/proxy-addr": { @@ -1145,20 +1121,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/type-is/node_modules/content-type": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.1.0.tgz", - "integrity": "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 7270259..70e8d0b 100644 --- a/package.json +++ b/package.json @@ -72,11 +72,11 @@ ], "devDependencies": { "@abap2ui5/node-runtime": "1.146.0", - "@abaplint/cli": "2.120.60", + "@abaplint/cli": "2.120.73", "@abaplint/transpiler-cli": "2.13.93", - "@openui5/sap.m": "1.144.0", + "@openui5/sap.m": "1.153.0", "ajv": "8.20.0", - "express": "5.2.1", - "playwright-core": "1.56.1" + "express": "5.3.0", + "playwright-core": "1.64.0" } } From 1b8384409991a511e90999af158dd25c543241fb Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 10 Oct 2026 20:42:23 +0000 Subject: [PATCH 2/2] Hold the UI5 SPA to every MUST: pin abap2UI5 main with the box-details fix CI's frontend job checked out abap2UI5 5d7e91f (app/webapp as at b812079, 1.146.0), where message box details stay empty on OpenUI5 >= 1.120, and test/frontend.test.mjs accepted portable.box-details failing. abap2UI5 fixed it on main in 72c86cc; the job now pins main 1bbb9d4, which carries it, and the known-fail list is empty - the documented procedure ("unpin it once CI's abap2UI5 commit does"). A frontend that loses the fix fails the test again. RESULTS.md, open question 7 and the changelog say so; the UI5 SPA measures 77 pass, 0 fail, 4 skip. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Te3BRpRpxNhZAYnrQL6Gdt --- .github/workflows/ci.yml | 2 +- CHANGELOG.md | 5 +++++ conformance/RESULTS.md | 17 +++++++++-------- spec/open-questions.md | 5 +++-- test/frontend.test.mjs | 10 +++++----- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d5fa9f..d4722ec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,7 +88,7 @@ jobs: uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: repository: abap2UI5/abap2UI5 - ref: 5d7e91f904bf37b282e8e1c0ecb2b3eeae4c5842 # main; app/webapp as at b812079 + ref: 1bbb9d47e9dce37015f2aa15f405689465f5b909 # main; carries the box-details fix (72c86cc) path: deps/abap2UI5 sparse-checkout: app/webapp persist-credentials: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 322c245..41e2fd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +- **The UI5 SPA is conformant (ui5 profile).** CI's frontend job pins + abap2UI5 main `1bbb9d4`, which carries the fix of `portable.box-details` + (abap2UI5 `72c86cc`); `test/frontend.test.mjs` no longer accepts that + deviation, so a frontend that loses the fix fails the test. 77 pass, + 0 fail, 4 skip (RESULTS.md). - **Adaptive Cards: app text is never Markdown.** A `TextBlock` or `Fact` whose text has Markdown syntax is a `RichTextBlock` `TextRun` now: a model value or toast like `[verify your account](https://evil.example)` diff --git a/conformance/RESULTS.md b/conformance/RESULTS.md index 76bedcf..a828bd7 100644 --- a/conformance/RESULTS.md +++ b/conformance/RESULTS.md @@ -126,7 +126,7 @@ perform. | Frontend | Version | Profile | Pass | Fail | Warn | Skip | Verdict | |---|---|---|---:|---:|---:|---:|---| -| UI5 SPA (`ui5`) | abap2UI5 1.146.0 `b812079` `app/webapp` (identical at main `5d7e91f`, which CI pins), OpenUI5 1.153.0 (npm), Chromium 141 | ui5 | 76 | 1 | 0 | 4 | one MUST deviation: `portable.box-details` | +| UI5 SPA (`ui5`) | abap2UI5 main `1bbb9d4` `app/webapp` (which CI pins), OpenUI5 1.153.0 (npm), Chromium 141 | ui5 | 77 | 0 | 0 | 4 | conformant (ui5) - `portable.box-details` fixed in abap2UI5 `72c86cc` | | agent client (`agent`) | abap2UI5/mcp-server `lib/appclient.mjs` @ `a4d9f07` (main, PR #44; vendored) | semantic | 61 | 0 | 0 | 20 | conformant (semantic) - the five MUST deviations of `ea4e9fa` fixed | | Adaptive Cards renderer (`adaptive-cards`) | [`renderers/adaptive-cards/`](../renderers/adaptive-cards/README.md) of this repository (prototype), Adaptive Cards 1.5 | portable | 66 | 0 | 0 | 15 | every check it can be driven through holds | | terminal renderer (`terminal`) | [`renderers/terminal/`](../renderers/terminal/README.md) of this repository, driven with keys through its state machine | portable | 72 | 0 | 0 | 9 | every check it can be driven through holds, the router checks included | @@ -135,17 +135,18 @@ perform. The UI5 SPA run is stable (two consecutive runs, identical results) and takes about two minutes; `test/frontend.test.mjs` pins the UI5, the agent, -the Adaptive Cards and the terminal result check by check. The UI5 pin accepts -`portable.box-details` passing: the fix of the UI5 frontend is under way -(open question 7, decided: expanded), and a local run against an abap2UI5 -checkout that carries it (2026-10-03, abap2UI5 `ed8115b` on top of `833b5b8` "Show message box -details on UI5 1.120 and later", on its working branch, not on main yet) -passed it - every MUST held, 77 pass, 4 skip. +the Adaptive Cards and the terminal result check by check. Until 2026-10-10 +CI pinned abap2UI5 `5d7e91f` (`app/webapp` as at `b812079`, 1.146.0), where +the UI5 SPA failed `portable.box-details` (finding 1 below; 76 pass, 1 fail, +4 skip, with OpenUI5 1.144.0 and 1.153.0 alike). abap2UI5 fixed it on main in +`72c86cc` (open question 7, decided: expanded); CI pins a main that carries +the fix, and the pin is gone - every MUST holds, 77 pass, 4 skip. ### Findings - the UI5 SPA 1. **Message box details are not shown on OpenUI5 >= 1.120** - - `portable.box-details`, MUST; *the frontend is wrong.* A + `portable.box-details`, MUST; *the frontend is wrong* (fixed in abap2UI5 + `72c86cc`, after 1.146.0). A `MESSAGE_BOX` with `details` shows the text and an empty details area. Evidence (OpenUI5 1.144.0): the box's VBox holds `Text` (visible), `Link "View Details"` (hidden), `MessageStrip "Details could not be diff --git a/spec/open-questions.md b/spec/open-questions.md index f710d50..2508fc4 100644 --- a/spec/open-questions.md +++ b/spec/open-questions.md @@ -214,8 +214,9 @@ structure *is* the message; behind a link it is easily never seen. fills the details text only when its "View Details" link is pressed - 1.120 does, 1.71 set it at creation) the UI5 frontend shows **no** details at all: `expandBoxDetails` makes the still-empty `FormattedText` visible and -hides the link that would have filled it. The UI5 frontend is being fixed -(abap2UI5 `app/webapp/core/actions/ControlCall.js`); filed in +hides the link that would have filled it. Fixed on abap2UI5's main in +`72c86cc` (`app/webapp/core/actions/ControlCall.js`, after 1.146.0), which +CI's frontend job runs; filed in [../conformance/RESULTS.md](../conformance/RESULTS.md#frontend-suite). **Alternatives considered.** diff --git a/test/frontend.test.mjs b/test/frontend.test.mjs index e5999c8..693f5c4 100644 --- a/test/frontend.test.mjs +++ b/test/frontend.test.mjs @@ -220,11 +220,11 @@ test("the terminal renderer: every portable-profile check it can be driven throu }); const skipBrowser = process.env.PROTOCOL_SKIP_BROWSER ? "PROTOCOL_SKIP_BROWSER is set" : false; -// The UI5 SPA's one deviation (RESULTS.md): message box details stay empty on -// OpenUI5 >= 1.120. The fix is under way in abap2UI5 (open question 7, decided -// in revision 0.3: expanded), so a checkout that carries it passes the check - -// the pin accepts both; every other failure fails the test. -const UI5_KNOWN_FAILS = ["portable.box-details"]; +// The UI5 SPA's known deviations (RESULTS.md) - none since CI's abap2UI5 +// commit carries the fix of portable.box-details (abap2UI5 72c86cc: message +// box details on OpenUI5 >= 1.120). A deviation found later goes here with +// the place of its fix; every other failure fails the test. +const UI5_KNOWN_FAILS = []; test("the UI5 SPA in Chromium: every MUST but the recorded deviation holds", { skip: skipBrowser, timeout: 900_000 }, async (t) => { if (!locateWebapp()) {