ADR-005: OQ-11 closed — Integration Suite native (ADK adapter + iFlows + SBPA)

Both options framed for OQ-11 failed the deciding criterion: whether the
next person finds the thing inside the platform. A CAP service or a
hardened worker on Cloud Foundry is discoverable only to whoever already
knows the route to it, which is ADR-002's original objection relocated
rather than answered.

The integration is now Integration Suite native. Nothing on Cloud
Foundry, nothing in ABAP:

- Arena connectivity as a custom adapter built with the Adapter SDK —
  sender adapter with the webhook endpoint and delta scheduler, cluster
  lock for single-flight login, ADK persistency for the delta cursor,
  tenant user credentials for Arena secrets.
- Movement as iFlows to the released Product / BOM / ChangeMaster /
  Attachment OData APIs.
- Human approval in SAP Build Process Automation (entitled in the global
  account, not yet assigned).

Decisive: every mechanism hand-rolled in worker/ has a first-class ADK
facility, so the adapter deletes that custom infrastructure rather than
merely relocating it; and the ADK's Java/Maven/OSGi toolchain is not a
new cost here, because the AS/400 FetchAPI servlets are already Java and
Java developers can be staffed in-house.

worker/ is reclassified from deliverable to specification: its 137 tests
describe the Arena session, delta-cursor and webhook behaviour the
adapter must reproduce. app/ has no target service under ADR-005 and is
kept as reference, unrepointed.

ADR-004's "side-by-side runtime" is narrowed to mean "in Integration
Suite". New verification items V-5 (can an ADK adapter hold an Arena
session under cluster lock — the first build) and V-6 (where SBPA tasks
surface for a business user).

No SAP tenant or BTP artifact was modified.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-29 11:22:05 -07:00
co-authored by Claude Opus 5
parent ffd33f4ec0
commit 272a202152
3 changed files with 195 additions and 32 deletions
+78
View File
@@ -2,6 +2,84 @@
Append-only decision log for this package.
## 2026-09-29 — ADR-005: OQ-11 closed. Integration Suite native — Arena ADK adapter + iFlows, approval in SAP Build Process Automation
- What changed: I closed OQ-11 and wrote
`docs/adr/ADR-005-integration-suite-native.md`. The integration becomes
Integration Suite native: an Arena custom adapter built with the Adapter SDK
(sender adapter carrying the webhook endpoint and the delta scheduler), iFlows
for the movement to the released Product / BOM / ChangeMaster / Attachment
APIs, and human approval in SAP Build Process Automation. Nothing runs on
Cloud Foundry; nothing is written in ABAP. I rewrote the PRD's target
architecture accordingly and added V-5 and V-6.
- Why: both options I had framed for OQ-11 failed the criterion that actually
decides this. The test is not build cost, it is whether the next person finds
the thing inside the platform — and a CAP service or a hardened worker on
Cloud Foundry is discoverable only to whoever already knows the route to it,
which is ADR-002's original objection relocated rather than answered.
Two findings then chose between the native options:
- Every mechanism I hand-rolled in `worker/` has a first-class ADK facility:
cluster lock for single-flight login, ADK persistency for the delta cursor,
user credentials for Arena secrets, scheduler support, connection status,
tracing, endpoint visualization, and versioning rules [source: SAP Help,
*Adapter Development Process*, Cloud Integration, verified 2026-09-29]. The
adapter does not merely present better; it deletes the infrastructure the
worker existed to supply.
- I had recorded the ADK's Java/Maven/OSGi toolchain as the cost of this
route. It is not a cost in this estate: the AS/400 FetchAPI servlets on
`mcl2000` are already Java, and Java developers can be staffed in-house. One
language and one team span both ends, and the ADK covers the on-premise leg
directly through *Accessing On-Premise Application using Cloud Connector* —
which retires the deleted Cloud Foundry `fetchapi-bridge` pattern instead of
rebuilding it.
- Affected: PRD (target architecture, decisions, OQ-11 closed, V-5 and V-6
added), new ADR-005, ADR-004 narrowed. `worker/` is reclassified from
deliverable to specification; `app/` has no target service under ADR-005 and
is kept as reference, not repointed. No SAP tenant or BTP artifact was
modified.
- Decision: ADR-005. I also correct something I asserted too confidently
earlier in the day: that SAP Build Process Automation tasks surface in the
Fiori launchpad. That is now V-6, unverified — what I can state is that the
service is entitled in the global account (`process-automation`,
`process-automation-service`) and therefore needs assigning, not buying.
First build is V-5: a minimal Arena sender adapter that logs in and holds the
session under cluster lock. Nothing else starts before it.
## 2026-09-29 — Read access to the customizing tenant proven through `mc-s4hana`; the parked password is simply stale
- What changed: nothing in the tenant — I established how to read it. Through
the BTP destination `mc-s4hana`, three read-only GETs against
`my429480` all answered 200: `API_BUSINESS_PARTNER/$metadata` (EDMX v1.0,
65 entity sets), `A_BusinessPartner?$top=1` (BusinessPartner `1710`), and
`api_product/srvd_a2x/sap/product/0002/$metadata` (EDMX 4.0, 39 entity sets).
I used the destination service instance `sap-apps-dest` and its existing
service key `dest-anywhere-dest-key`; I created no key and no instance.
- Why: after retargeting, direct basic auth to the customizing tenant returned
401, and I needed to know whether the tenant was refusing the user or the
stored password was wrong.
- Affected: no SAP object, no BTP artifact. Knowledge only.
- Findings:
- `mc-s4hana` authenticates as **`BasicAuthentication` with the same user,
`AZ_API_USER`**, and succeeds. So the tenant accepts that user over basic
auth: the 401 was neither a lockout nor a user problem. The password in
`_shared/.env.starter-cust-my429480.bak` is stale, and the working value is
already held by the destination. No credential reset is needed.
- The destination's own description reads "SAP S/4HANA Public Cloud - MC
Production" while its URL is the starter customizing tenant — the same
mislabel this package carried, now visible in BTP as well. I left it alone;
it is shared, and a description is not worth an unrequested change.
- `default-env.json` alone does not work with SAP Cloud SDK v4:
`@sap-cloud-sdk/connectivity` 4.6.0 resolves bindings through `@sap/xsenv`'s
`filterServices()`, which reads `process.env.VCAP_SERVICES` and never loads
the file. `require('@sap/xsenv').loadEnv()` must run ahead of the SDK
requires (or `VCAP_SERVICES` be exported). The first attempt failed with
"Could not find service binding of type 'destination'".
- Decision: I will not copy the working password out of the destination into
`.env`. The destination is the sanctioned path for this estate, so the fix is
to make the shared CLI destination-aware rather than to hold a second copy of
a credential. Until that is done, reads against the customizing tenant go
through a destination-based call, not through `sap-api`.
## 2026-09-29 — Tooling retargeted to the starter customizing tenant; its credential is rejected
- What changed: