Sync current sources: clean RAP handover names, app rebind, tooling
Working-tree state as of 2026-09-29, uncommitted since the initial "upload current sources" commit: - docs/handover/rap/: renamed the 11 generator-suffixed sources (zz*000) to the clean object names built on the tenant, plus the A2X leg and parameter-entity edits. - app/: manifest, annotations, i18n, mock data and local/mock ui5 configs updated to the live service shape. - PRD.md, CHANGELOG.md, KNOWLEDGE.md: build record through 2026-09-19, including the rejected reentrance-ticket path. - tools/adt-reentrance-login/: retained login helper (new). - docs/v2/zui_arena_change_appr_o4.metadata.xml: captured live $metadata (new). - Dropped a stray 0.3GB-class Eclipse installer that the initial commit had tracked under a URL-mangled filename, and the machine-specific 0M7DEJI.code-workspace. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+202
@@ -101,6 +101,208 @@ entries the same way — dated and falsifiable.
|
||||
SRVB creation validate the referenced object's ACTIVE version, so create
|
||||
and activate DDLS/SRVD sources first. ATC via MCP rejects RONT/NONT.
|
||||
|
||||
- [2026-09-16] **An expired VS Code ADT logon shows up in the ADT MCP only as
|
||||
"Your user was logged off."** `abap_list_destinations` still lists the
|
||||
destination and `get_object_type_details` still returns field metadata,
|
||||
so neither proves a live session. **ADT for VS Code logs on to S/4HANA
|
||||
Cloud with a reentrance ticket and a localhost redirect:** it opens
|
||||
`https://<tenant>/sap/bc/adt/core/http/reentranceticket?redirect-url=http://localhost:<port>/adt/redirect`,
|
||||
and after SSO the tenant redirects to
|
||||
`http://localhost:<port>/adt/redirect?…&reentrance-ticket=<ticket>`
|
||||
(observed 2026-09-16). The ticket in that URL is a live logon credential:
|
||||
never paste it into chats, logs or files. The same mechanism is the
|
||||
plausible browser-free login path for `abap-adt-mcp` (OQ-9). **Tested
|
||||
2026-09-18: it does not work.** With a freshly captured reentrance
|
||||
ticket, `https://my431353.s4hana.cloud.sap/sap/bc/adt/core/discovery`
|
||||
and an ABAP class source URL answered HTTP 200 with the same 3094-byte
|
||||
SAML redirect page (`SAMLRequest`, `saml2`) for all of: `Cookie:
|
||||
MYSAPSSO2=<ticket>`, header `MYSAPSSO2: <ticket>`, and no credential at
|
||||
all, with and without `?sap-client=080`. A reentrance ticket is
|
||||
therefore neither a logon-ticket cookie nor an assertion-ticket header
|
||||
here; ADT exchanges it some other way. Do not spend more on
|
||||
`abap-adt-mcp`'s `sso2` mode without first capturing what the extension
|
||||
actually sends. `abap_creation-run_validation` is the
|
||||
cheapest read-only liveness check (it answers "… validation failed: Your
|
||||
user was logged off."). Fix it by logging on to the destination again in
|
||||
VS Code; the MCP port and token stay the same unless VS Code reloads
|
||||
(live 2026-09-16, ~1.5 h after the last successful call).
|
||||
- [2026-09-16] **Ask the ADT MCP for name limits and package existence; do
|
||||
not guess them.** `abap_creation-get_object_type_details` returns each
|
||||
type's create fields and `maxLength`: `TABL/DT` 16, while `DDLS/DF`,
|
||||
`SRVD/SRV`, `SRVB/SVB` and `BDEF/BDO` allow 30 (the generator's `APPRVL`
|
||||
truncation came from that 30 limit). `abap_creation-run_validation` is a
|
||||
read-only way to check that a package exists: a missing package answers
|
||||
"Package '<name>' does not exist" [source: adt-mcp on 0M7DEJI, verified
|
||||
2026-09-16]. The Claude Code session does not expose the adt-mcp tools
|
||||
unless the server was up at session start. A JSON-RPC probe over
|
||||
`http://127.0.0.1:2236/mcp` with the `.mcp.json` bearer token works for
|
||||
read-only checks in the meantime.
|
||||
|
||||
- [2026-09-16] **In the VS Code ADT workspace, the `.json` file in an object
|
||||
folder is header metadata, never the source.** A table folder holds
|
||||
`zchangeapproval.tabl.json` (formatVersion, description, originalLanguage,
|
||||
`abapLanguageVersion`) and `zchangeapproval.tabl.ddic` (the Dictionary DDL
|
||||
source). Paste into `.ddic`, and activate through the `.tabl.ddic` URI
|
||||
(live, "Activation successful."). For objects created with
|
||||
`create_object`, the returned `filePath` names the source file: DDLS
|
||||
`.ddls.acds`, DCLS `.dcls.acds`, BDEF **`.bdef.abdl`** [source: adt-mcp
|
||||
abap_creation-create_object / abap_activate_objects on 0M7DEJI, verified
|
||||
2026-09-16]. The `.tabl.json` / `.bdef.json` activation URIs recorded on
|
||||
2026-09-15 were generator objects; trust the returned `filePath` over
|
||||
that table. BDEF activation through `.bdef.abdl` is proven (U6, live).
|
||||
- [2026-09-16] **A managed `strict ( 2 )` BDEF activates before its
|
||||
behavior pool class exists** (`ZR_CHANGEAPPROVAL`, "Activation
|
||||
successful.", with no class `ZBP_R_CHANGEAPPROVAL` yet) [source: adt-mcp
|
||||
abap_activate_objects on 0M7DEJI, verified 2026-09-16]. Once the class
|
||||
exists, activate BDEF and class together. `abap_activate_objects` returns
|
||||
only "Activation successful." with no warnings on success. On failure it
|
||||
lists messages with line and column but no severity (U13 SRVD,
|
||||
2026-09-16), so read severity in the editor. Service definitions
|
||||
report "Comments are not supported and will be deleted on save" for a
|
||||
leading block comment, and **that message blocks activation**: the same SRVD failed with a
|
||||
19-line `/* */` header and activated without it (live 2026-09-16; the
|
||||
DCLS, DDLX and BDEF headers did not block). The language allows comments
|
||||
[source: abap-docs /abap-docs-cloud/ABENCDS_GENERAL_SYNTAX_RULES,
|
||||
verified 2026-09-16], so this is the tooling. Keep SRVD sources free of
|
||||
comments. `abap_atc_get_result` returned only totals for a run with 43
|
||||
infos (UI leg), but per-object `findings[]` (priority, check class,
|
||||
message id and title, quick-fix flags) for a run with a priority-3
|
||||
warning (worker leg). Expect details for warnings and errors at least
|
||||
(both runs live 2026-09-16). A projection BDEF over a view with
|
||||
`@AccessControl.authorizationCheck: #CHECK` raises SLIN W607 (+BDL 549)
|
||||
"should be replaced with #MANDATORY" (priority 3; it does not block
|
||||
activation). An OData V4 **Web API** binding reports
|
||||
`bindingCategory: "1"` (UI: `"0"`) in `fetch_services`.
|
||||
- [2026-09-16] **OData V4 identity on a RAP UI service: the binding name is
|
||||
only the URL's first segment.** For definition `ZUI_ARENA_CHANGE_APPROVAL`
|
||||
and binding `ZUI_ARENA_CHANGE_APPR_O4`, the live `$metadata` uses
|
||||
namespace `com.sap.gateway.srvd.zui_arena_change_approval.v0001`, from the
|
||||
**service definition**, and entity type `ChangeApprovalType`, with a
|
||||
`Type` suffix and no underscore (live 2026-09-16,
|
||||
`docs/v2/zui_arena_change_appr_o4.metadata.xml`). The earlier assumption
|
||||
that the namespace carries the binding name and a `_Type` suffix was
|
||||
wrong. RAP also emits `__OperationControl` with
|
||||
`Core.OperationAvailable Path="_it/__OperationControl/<action>"` for
|
||||
`features : instance` actions, `SAP__Messages`, `Nullable="false"` on
|
||||
non-key elements, and `cast( case … as abap_boolean preserving type )`
|
||||
surfaces as `Edm.Boolean` (INT1 literals as `Edm.Byte`, `utclong` as
|
||||
`Edm.DateTimeOffset Precision="7"`). Copying `$metadata` from Chrome's
|
||||
XML tree view decodes `&` to `&`; use `view-source:` or re-escape.
|
||||
- [2026-09-16] **Live RAP `$metadata` works verbatim as Fiori mock metadata**
|
||||
(`@sap-ux/fe-mockserver-core` 1.7.15 serves it and accepts `$select` on
|
||||
`__OperationControl/approve`). Mock rows must then carry
|
||||
`__OperationControl`, or the enablement paths resolve to nothing. The
|
||||
app's ESLint config checks only TS/JS, so run `npx @ui5/linter` for UI5.
|
||||
The fiori-mcp `list_functionality` for `app/` offers only
|
||||
add/delete page and controller extension, so dataSource and annotation
|
||||
edits are made directly. The cached `@ui5/manifest` 1.89.0 schema
|
||||
rejects the generator's manifest `_version: "2.11.0"`; that is not a
|
||||
defect in the app.
|
||||
- [2026-09-16] **A published custom UI service answers on the UI host, not the
|
||||
`-api` host, for a business user.** `fetch_service_information` reports
|
||||
the service URL on `my431353-api.s4hana.cloud.sap` (with
|
||||
`sap-client=080`), but a browser business-user call there is refused as
|
||||
"Forbidden / blocked by UCON". The same path on
|
||||
`my431353.s4hana.cloud.sap` returns `$metadata` for the developer user,
|
||||
before any IAM app exists (live 2026-09-16). The `-api` host is the
|
||||
communication-user entry point (communication arrangement), so the
|
||||
worker's A2X service goes there through a custom communication scenario
|
||||
(V-2), never the UI service. After publishing, ADT for VS Code reports
|
||||
"<binding> published locally".
|
||||
- [2026-09-16] **In ADT for VS Code, publishing a service binding is a code
|
||||
lens, not a button or a palette command.** Open the binding's `.srvb.json`
|
||||
source and click the **Publish** code lens; Unpublish and Preview… work the
|
||||
same way [source: sap-docs sap-help loio dd6f5de63e7245a7abe7e39389841596
|
||||
"ABAP RAP Tools", verified 2026-09-16]. The extension (1.1.2) contributes
|
||||
no publish command, and the SAP ADT MCP has no publish tool. `create_object` for a class returns only the global
|
||||
`.clas.abap` path, no local-types (CCIMP) path.
|
||||
- [2026-09-16] **`abap-adt-mcp` 2.1.0 auto-detects a browser for SSO only on
|
||||
macOS.** `detectBrowser()` checks `SAP_BROWSER_PATH` and then three
|
||||
`/Applications/…` paths; otherwise it throws "No Chrome/Edge/Brave found
|
||||
for SSO login" (`dist/lib/browserLogin.js:38-50`, read 2026-09-16). On
|
||||
this Linux host the server env must carry
|
||||
`SAP_BROWSER_PATH=/usr/bin/google-chrome` along with the desktop display
|
||||
variables. Login harvests the HttpOnly `MYSAPSSO2`/`SAP_SESSIONID` cookies
|
||||
over the Chrome DevTools Protocol (`puppeteer-core`). `listSystems` needs
|
||||
no SAP call and is the safe first probe of its policy. **Its SSO does not
|
||||
work from a remote shell:** there is no localhost redirect (SAML returns
|
||||
to the tenant), and the sign-in must be typed into the server-side Chrome
|
||||
window (`headless: false`, profile
|
||||
`~/.abap-adt-mcp/sso/<host>`, `--remote-debugging-port=0`, 300 s timeout).
|
||||
Over multi-hop SSH neither the desktop nor a DevTools relay is reachable in
|
||||
practice. Do the first sign-in at the server's desktop; with "stay signed
|
||||
in" later logins should complete unattended (unverified, 2026-09-16).
|
||||
- [2026-09-16] **Create fields for the remaining RAP types (`get_object_type_details`
|
||||
on 0M7DEJI):** `CLAS/OC`: packageName, name (≤30), description, optional
|
||||
superclass, interfaces. `DCLS/DL`: packageName, name (≤30), description,
|
||||
optional `protectedEntity`. `DDLX/EX`: packageName, name (≤**40**),
|
||||
description, optional `extendedEntity` [source: adt-mcp
|
||||
abap_creation-get_object_type_details on 0M7DEJI, verified 2026-09-16].
|
||||
Pass `protectedEntity` / `extendedEntity` so the editor starts from the
|
||||
right skeleton. DCLS creation does **not** require the protected entity to
|
||||
be active. `ZC_CHANGEAPPROVAL_A2X` access control validated and was
|
||||
created while its DDLS was still empty and never activated (unlike
|
||||
BDEF/SRVB creation). `SRVB/SVB` `bindingType` values are exactly `OData
|
||||
V2 - UI`, `OData V2 - Web API`, `OData V4 - UI`, `OData V4 - Web API`,
|
||||
whatever label the release notes use [source: adt-mcp
|
||||
abap_creation-run_validation / create_object /
|
||||
get_object_type_details on 0M7DEJI, verified 2026-09-16].
|
||||
- [2026-09-16] **Service binding names: SAP Help says 26 characters, the
|
||||
ADT MCP allows 30.** The 26-character limit appears on the ABAP Cloud,
|
||||
SAP Cloud Platform and ABAP Platform 2021 "Creating Service Binding"
|
||||
pages [source: sap-docs sap-help loio 4bad0d7280b742a68dd2d42b1441f09a,
|
||||
verified 2026-09-16]. `get_object_type_details` reports 30 for
|
||||
`SRVB/SVB`, and the `x-ui-service` generator itself emits 29–30-character
|
||||
bindings, which activated unpublished on `my431353` on 2026-09-15.
|
||||
Whether publishing accepts more than 26 is unknown. Stay at 26 or fewer
|
||||
rather than find out after a whole BO leg. The generator does not keep to
|
||||
the documented limit, which is one more reason not to use it for names
|
||||
that ship.
|
||||
- [2026-09-16] **In an OData V4 binding URL
|
||||
`/sap/opu/odata4/sap/<binding>/srvd/sap/<alias>/0001/`, the second
|
||||
segment is the binding's service name (alias), not necessarily the
|
||||
service definition name. It can be renamed only while the binding is
|
||||
unpublished** [source: sap-docs community-14433266 "How to rename an
|
||||
OData V4 service?", verified 2026-09-16]. Check it before publishing.
|
||||
- [2026-09-16] **CDS CASE results take the longest branch type, and untyped
|
||||
integer literals are typed INT1..INT8 by value** [source: abap-docs
|
||||
/abap-docs-cloud/ABENCDS_CASE_EXPRESSION_V2, ABENCDS_UNTYPED_LITERAL_V2,
|
||||
verified 2026-09-16]. A text CASE over status codes becomes CHAR(n) of
|
||||
the longest literal, and a 0–5 criticality becomes INT1. Cast
|
||||
explicitly when the OData type matters.
|
||||
- [2026-09-16] **The `ui5-mcp-server` linter cannot see this repo.** The
|
||||
server is reached over SSE on `mcp.alexzaw.dev`, and `run_ui5_linter` on
|
||||
`app/` fails with `ENOENT: realpath '/home/alexz/…/arena-plm/app'`
|
||||
(live 2026-09-16). Its doc/API tools work; its file-based tools
|
||||
(linter, manifest validation, project info) do not. For real UI5 code
|
||||
changes, lint locally (`npx @ui5/linter` inside `app/`) or run the
|
||||
server where the files are.
|
||||
- [2026-09-16] **The Fiori mock server does not simulate bound actions.**
|
||||
Without a per-entity `webapp/localService/mainService/data/<Entity>.js`
|
||||
exporting `executeAction`, `@sap-ux/fe-mockserver-core` 1.7.15 returns
|
||||
the action data unchanged
|
||||
(`node_modules/@sap-ux/fe-mockserver-core/dist/mockdata/fileBasedMockData.js:547-549`,
|
||||
read locally 2026-09-16). Status transitions can be shown only against
|
||||
the live RAP service, or with a hand-written mock handler.
|
||||
- [2026-09-16] **Cast the whole CASE to a data element, never each
|
||||
branch.** "If a data element is specified for `dtype`, the result …
|
||||
inherits the semantic properties of the data element. An exception to
|
||||
this is the use of the `CAST` expression within a case distinction."
|
||||
Write `cast( case … end as abap_boolean preserving type )`.
|
||||
`PRESERVING TYPE` requires an exact match of built-in type and length
|
||||
[source: abap-docs /abap-docs-cloud/ABENCDS_CAST_EXPRESSION_V2, verified
|
||||
2026-09-16]. To guarantee that length, use typed literals in the branches
|
||||
(`abap.char'X'`, `abap.char' '` are CHAR(1)): an untyped character
|
||||
literal's length is only "at least as large as the actual length of the
|
||||
literal" [source: abap-docs /abap-docs-cloud/ABENCDS_TYPED_LITERAL_V2,
|
||||
ABENCDS_UNTYPED_LITERAL_V2, verified 2026-09-16]. `ABAP_BOOLEAN` is CHAR 1
|
||||
[source: abap-docs /abap-docs-standard/ABENDATAOBJECTS_TRUE_VALUE_GUIDL,
|
||||
verified 2026-09-16]. The same caveat means a CASE over untyped status
|
||||
literals is not provably CHAR(n) of the longest literal.
|
||||
- [2026-09-16] **`sap-released-objects` has no `SRVB` object type for
|
||||
public_cloud**, the same gap as `DDLS` (use `CDS_STOB` for views). Binding
|
||||
release questions cannot be answered from that server.
|
||||
|
||||
- [2026-09-15] **Developer business catalogs: `SAP_A4C_BC_*` is the Public
|
||||
Cloud / BTP ABAP family; `SAP_A4_BC_*` is on-premise / Private Cloud.** On
|
||||
`my431353` the developer role carries the A4C catalogs (e.g.
|
||||
|
||||
Reference in New Issue
Block a user