# ADR-001 — CAP-first rebuild; Express predecessor demoted to reference Date: 2026-09-04 · Status: Accepted — **amended by ADR-002 (2026-09-04)**: the rebuild target is now on-stack RAP + Fiori Elements in the tenant, with a side-by-side connectivity worker; CAP exits the architecture. This ADR's core rationale — the SAP toolchain must engage, and the Express shape is not the pattern — stands unchanged. ## Context The working predecessor (`~/projects/sap-apps/arena-plm`) is Express.js + axios with hand-rolled SAP patterns. It functions, but it sits outside the SAP-native toolchain: the CAP, Fiori, and UI5 MCP servers and skills had nothing to attach to, so development guidance never engaged, and the implementation drifted from SAP best practice — hand-managed CSRF tokens, an approval store in droplet-local SQLite that vanishes on restart, JWT validation with no scope checks. The estate is explore-phase; there is no production cutover to protect, so preserving the legacy shape has no value beyond reference. ## Decision I rebuild arena-plm as a CAP (Node.js) application: the approval domain modeled in CDS, all S/4HANA calls through CAP remote services / SAP Cloud SDK via the `mc-s4hana` destination, and Fiori Elements evaluated before any custom UI5. The Express app is reference-only — consulted for behavior and tombstones, never extended. ## Consequences - The SAP toolchain becomes load-bearing: `cap-mcp-server` is consulted on every model and service change, which is the corrective for the tooling-never-engaged failure mode. - Auth, CSRF, and destination handling move onto framework-managed code paths, eliminating the predecessor's hand-rolled plumbing. - The approval workflow domain must be re-modeled in CDS; behavior parity is checked against the reference app, never assumed from it. - Whether the sync-pipeline half stays inside CAP or becomes a separate hardened worker is deliberately deferred (PRD OQ-4).