Skip to content

整合資料契約

另有 19 種語言版本

English · Español · 日本語 · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Українська · Español (México) · Français (Canada) · Deutsch (Schweiz)

A locomotive and a freight car a foot apart on the same track, their couplers lined up and the brake hoses hanging below.
圖片由 AI 生成

第 4 個模組,共 4 個,屬於 Data Architect 課程第 9 章整合與資料流動。每個模組都可以單獨閱讀。 Previous: Proof of Delivery · Next: the next chapter, Migration and Synchronization ⟲

**本模組回答的問題:**如何寫下每個整合可以對資料做什麼?

By now we’ve asked a lot of questions about an arrow: who starts it, which way the data moves, how current, how much, what key, who owns each field, which pattern, which mechanism, who proves it arrived. Those decisions shouldn’t live only in the architect’s head, or scattered across a diagram, a story in the backlog, an API spec, a spreadsheet, three chat threads and the memory of whoever built it. I want a small architectural contract for every important arrow: the integration data contract. ⟲

Here’s Steve Trucking’s landscape one more time, in the same places as module 1. In chapter 4 we learned to see the arrows. In this chapter we’ve learned to ask what each one means. Now give each important arrow a number. ⟲

Every important arrow gets a contract Steve Trucking's landscape in the same places as before, with each important arrow numbered as a contract. C1, Redrock's manifests in, upserted into Salesforce by the partner key, in amber; C2, status out to Redrock; C3 and C4, Keystone's manifests in and status out; C5 and C6, Brightwave's; C7, status events from Salesforce through the integration layer to Snowflake; C8, FleetLink's latest truck position; C9, delivery counts from Salesforce through the integration layer to the finance ERP. Underneath: nine important arrows, nine contracts; the landscape is the index; each number opens a contract. {"author": "Steve Simpson", "blueprint": "1.0.1", "builder": "standard 1.54.0", "built": "2026-10-30", "id": "DGM-DA-DI-42", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "system-landscape 0.13.0", "theme": "stevetecharc 1.4.0"} ABOVE: IDENTITY, APPEXCHANGE, WEB PEOPLE RIGHT: INTERNAL SYSTEMS BELOW: CUSTOMER CHANNELS BOTTOM RIGHT: PARTNERS AND PROVIDERS Dispatch coordinators 45, inside 9 partner DCs Delivery crews ~700 on 330 trucks Care and office staff 100: service, ops, finance Retail Partner users ~300 at 3 partners Recipients ~1 million a year Corporate IdP SSO for office staff only Retail Partner portal Tracking page INTEGRATION Snowflake status history, analytics FleetLink raw GPS stays here Finance ERP invoices partners, pays crews Photo storage 4–5 million a year, off core RouteDesk archive retired; 8 years of history Phone care agents Email email-to-case SMS and email provider day-before message, with a link Redrock REST API, webhooks Keystone CSV over SFTP Brightwave EDI through a third-party network Salesforce Field Service, one US org a link, no login office staff only calls cases in C1 manifests in C2 status out C3 manifests in C4 status out C5 manifests in C6 status out C1 upserts, partner key C7 status events C7 status events C8 latest position C9 delivery counts C9 delivery counts photos, from the crews' app day-before, with a link Salesforce a community people identity, apps, web an internal system a customer channel the integration layer starts at the system that opens the connection; the label says what moves a shared certificate: trust, no direct call C1, the contract we open next Nine important arrows, nine contracts. The landscape is the index; each number opens a contract. © 2026 Twinshark LLC · stevetecharc.com
點擊放大

The landscape is the index. Each number opens a contract. ⟲

Nine arrows, nine contracts. Notice that every partner has two: manifests in and status out are different integrations, with different initiators, timing, keys, fields and failure handling. A double-headed arrow labeled “partner sync” would hide all of that. I’d rather have two clear contracts than one vague “bidirectional” one. ⟲

一個箭頭需要的不只是一個標籤

Section titled “一個箭頭需要的不只是一個標籤 ”

A label like “Account Sync” says almost nothing. Does the ERP send or does Salesforce ask? Hourly, nightly, as it happens? Ten accounts a day or ten million? Matched by Salesforce ID, customer number or name? Which fields may the ERP change? What if record 4,291 fails? The label hides every one of those decisions. The contract exposes them. ⟲

The first lines are module 1’s questions, now written down as decisions. Then two lines the integration architect fills in, and two that Salesforce’s own Well-Architected guidance adds: ⟲

LineThe decision
發起方誰發起對話?
資料方向業務資料往哪個方向流動?
FreshnessHow current must the data be, in a number?
資料量和形狀有多少,是單條、成組還是批次?
鍵我們如何在各系統之間識別同一條記錄?
Write authorityWhich system owns, and may write, which fields?
PatternRequest and reply, fire and forget, batch, or events?
機制用什麼來實現?
Proof of deliveryWho proves it arrived, and owns recovery?
Sensitivity and travelHow sensitive is the data, and where does it pass through?
ChangeHow does the contract change without breaking the other side?

It extends chapter 4’s landscape inventory, one row per arrow. It isn’t an API specification: endpoints, payloads, schemas, authentication and response codes all matter, later. First I want to know what the integration is supposed to mean to the enterprise’s data. ⟲

The last two lines come straight from Salesforce’s framework. Its data protection guidance expects “data classification preserved across system boundaries” and “data transit paths evaluated for residency compliance, not just storage location”; one of its anti-patterns is integration middleware running in a region outside the compliance boundary (Data Protection Patterns (在新標籤頁中開啟)). And for events it says “event schemas become contracts between producers and consumers”: add new fields rather than changing existing ones, and version explicitly when a breaking change can’t be avoided (Operational Excellence (在新標籤頁中開啟); both checked 2026-10-27). ⟲

Now zoom in on C1. In module 1 we asked Redrock’s arrow seven questions. Here are the answers as a contract, and next to each line, how we’ll know it’s true. ⟲

Contract C1: Redrock's manifests Contract C1 zoomed in: Redrock, the client, with its order system and REST API, sends manifests in to Salesforce, the server, with the integration layer in front. Eleven lines, each with what contract C1 says and how we'll check it. Initiator: Redrock calls in through the integration layer; every call is in the integration log with Redrock's request ID. Data direction: Redrock to Salesforce, with status going back as C2; no status fields in C1's payload. Freshness: a revision is on the Work Order within 15 minutes; measure the time from Redrock's send to the update every day. Volume and shape: about 1,100 deliveries a day, a set per distribution center each evening, then single revisions, growing 30% a year; daily counts on a dashboard, with an alert at double. Key: Partner_Delivery_Key__c, REDROCK-…, unique, assigned by Redrock; upsert never matches twice, zero duplicates. Write authority: Redrock owns the items, the address and the delivery date, Salesforce the appointment, the crew and the route; a test payload that changes the crew is refused. Pattern: request and reply, in sets; each set gets per-record results. Mechanism: the integration architect's choice, to fit the lines above; reviewed against this contract. Proof of delivery: Redrock, from the per-record results, with rejections going back with reasons; sent equals accepted plus rejected, every evening. Sensitivity and travel: Recipient names and addresses are confidential and stay in the US; check the integration layer's region and the logs' retention. Change: new fields are added, never renamed, and breaking changes get a new version; old payloads still load after a release. Underneath: a contract line is only finished when you can check it. {"author": "Steve Simpson", "blueprint": "1.1.0", "builder": "standard 1.46.0", "built": "2026-10-27", "id": "DGM-DA-DI-41", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "system-landscape/connection 0.12.0", "theme": "stevetecharc 1.4.0"} C1 manifests in CLIENT Redrock SERVER Salesforce Order system, REST API Integration layer in front CONTRACT C1 SAYS HOW WE'LL CHECK IT Initiator Redrock calls in, through the integration layer. Every call in the integration log, with Redrock's request ID. Data direction Redrock to Salesforce. Status goes back as C2. No status fields in C1's payload. Freshness A revision is on the Work Order within 15 minutes. Time from Redrock's send to the update, every day. Volume and shape About 1,100 deliveries a day: a set per DC each evening, then single revisions. Growing 30% a year. Daily counts on a dashboard; alert at double. Key Partner_Delivery_Key__c, REDROCK-…, unique, assigned by Redrock. Upsert never matches twice; zero duplicates. Write authority Redrock: items, address, delivery date. Salesforce: appointment, crew, route. A test payload that changes the crew is refused. Pattern Request and reply, in sets. Each set gets per-record results. Mechanism The integration architect's choice, to fit the lines above. Reviewed against this contract. Proof of delivery Redrock, from the per-record results; rejections go back with reasons. Sent = accepted + rejected, every evening. Sensitivity and travel Recipient names and addresses: confidential. Stays in the US. The integration layer's region; the logs' retention. Change New fields are added, never renamed. Breaking changes get a new version. Old payloads still load after a release. A contract line is only finished when you can check it. © 2026 Twinshark LLC · stevetecharc.com
點擊放大

Contract C1. A line is only finished when you can check it. ⟲

Notice two things. First, we made nearly every data decision before choosing the technology. The mechanism line says “the integration architect’s choice, to fit the lines above,” and that’s healthy: what, why, who, how much, how current, whose value, who proves it arrived. Then the integration architect picks the mechanism that satisfies the contract. ⟲

Second, look at the right-hand column. Every line has a test. “A revision is on the Work Order within 15 minutes” can be measured every day. “Sent equals accepted plus rejected” can be checked every evening. A contract line you can’t check is a hope, not a requirement. ⟲

Requirements, Then Pattern, Then Mechanism

Section titled “Requirements, Then Pattern, Then Mechanism”

When I teach integration, I give people the order to think in. First the requirements: the direction of action, who starts it, which can be different from the way the data flows; the source and the target; the timing, real time, near real time or batch; and the volume. Then the pattern: fire and forget, request and reply, batch data synchronization, virtualization, remote call-in, an update to the user interface when data changes. Then the mechanism. And there are only so many ways in and out of Salesforce: the REST, SOAP, Bulk, Streaming and Pub/Sub APIs, platform events, Change Data Capture, outbound messaging, callouts from Apex, Flow or External Services, Salesforce Connect, Heroku Connect. Those are the doors. Pick one only once you know what has to walk through it. ⟲

Here’s C1 walked through that order. ⟲

From requirement to mechanism A funnel from requirement to mechanism. At the top, the requirement, contract C1: Redrock starts it, revisions in 15 minutes, about 1,100 deliveries a day, in sets. Patterns set aside: fire and forget and events, because Redrock needs a result for every record to prove delivery, and a nightly batch, because revisions can't wait. The pattern: request and reply, in sets. Mechanisms set aside: the Bulk API, built for millions, not 1,100; callouts and outbound messages, because Salesforce doesn't start this arrow. At the bottom, highlighted, the mechanism: calls into Salesforce, a set per call, upserting by the partner key, the integration architect's choice. Underneath: requirement, pattern, mechanism; start at the mechanism and you skipped the architecture. {"author": "Steve Simpson", "blueprint": "1.0.0", "builder": "standard 1.46.0", "built": "2026-10-27", "id": "DGM-DA-DI-43", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "funnel 0.2.0", "theme": "stevetecharc 1.4.0"} The requirement, contract C1 Redrock starts it · revisions in 15 minutes · about 1,100 a day, in sets Set aside: Patterns fire and forget and events: Redrock needs a result for every record to prove delivery; a nightly batch: revisions can't wait The pattern request and reply, in sets Set aside: Mechanisms the Bulk API: built for millions, not 1,100; callouts and outbound messages: Salesforce doesn't start this arrow The mechanism calls into Salesforce, a set per call, upserting by the partner key: the integration architect's choice Requirement, pattern, mechanism. Start at the mechanism and you skipped the architecture. © 2026 Twinshark LLC · stevetecharc.com
點擊放大

Requirement, pattern, mechanism. Every option set aside has a reason you can say out loud. ⟲

The two get collapsed all the time. “We’re using REST” doesn’t tell me the architecture: who calls whom, when, how often, how much, what happens on failure. REST is a mechanism; the contract gives it meaning. And don’t let the mechanism become the requirement. “We need a REST integration” is probably not the requirement. “When a delivery is revised, the coordinator sees it on the Work Order within 15 minutes” is. Now we can architect: maybe REST, maybe events, maybe the integration platform already does it, maybe Salesforce should fetch the value instead of storing it. Requirement, pattern, mechanism. Start at the mechanism and you skipped the architecture. ⟲

And build for more than what’s asked. Every integration has implied requirements nobody writes down: errors will happen, volumes will grow, the business will add a second flow next year. Plan for three years, not just go-live. The contract is where those implied requirements become explicit. ⟲

Test knowledge. Separate the pattern (how the systems interact) from the mechanism (what implements it). Expect a scenario that describes requirements (who starts it, which way the data moves, how fast, how much) and asks for the pattern or the Salesforce mechanism that fits: for example, near real time from Salesforce without waiting for an answer points to platform events; millions of records points to the Bulk API. ⟲

The contract isn’t only between systems. It’s between teams. On one project, the middleware team built the integrations into Salesforce, and we had a decision to make in the first week or two: would they call Salesforce’s standard REST API, or a custom API we built for them? ⟲

With the standard API, the middleware team has to know Salesforce deeply: your objects, your fields, your picklist values, the order the records have to be written in, and what each error means. They call the standard APIs, and they handle the issues. ⟲

A contract between teams The middleware team on the left, Salesforce on the right with a Work Order object, a field, Delivery_Window__c, and the Status picklist values. First, with the standard API, the middleware team writes the object, writes the field and uses the picklist values directly. Then a release renames the field to Arrival_Window__c, tagged "changed", and the middleware team's arrow to it turns red with an X: it breaks. Last, with a custom API, the middleware team calls one endpoint, Manifest API v1, a custom Apex REST endpoint that Salesforce owns and that logs every call, tagged "the contract"; inside, it orchestrates the writes to the object, updates the renamed field and maps the picklist values, so the rename is absorbed inside. Underneath: with the standard API, the other team must know your data model and change when it changes; with custom Apex REST, there is one endpoint, your own logging and orchestration, and code you maintain; decide in the first weeks. MIDDLEWARE TEAM SALESFORCE Middleware team builds Redrock's integration Work Order the object Delivery_Window__c a field Status its picklist values writes the object writes the field uses the values Standard API: the other team must know your data model and change when it changes. Custom Apex REST: one endpoint, your own logging and orchestration, and code you maintain. Decide in the first weeks. HOW TO READ IT the contract Salesforce owns: a custom Apex REST endpoint © 2026 Twinshark LLC · stevetecharc.com
點擊放大

The standard API: the middleware team works with your objects and fields directly. ⟲

Add a custom object, rename a field, change a picklist value, and the integration breaks unless they’re in your meetings and quick to change their side. ⟲

A contract between teams The middleware team on the left, Salesforce on the right with a Work Order object, a field, Delivery_Window__c, and the Status picklist values. First, with the standard API, the middleware team writes the object, writes the field and uses the picklist values directly. Then a release renames the field to Arrival_Window__c, tagged "changed", and the middleware team's arrow to it turns red with an X: it breaks. Last, with a custom API, the middleware team calls one endpoint, Manifest API v1, a custom Apex REST endpoint that Salesforce owns and that logs every call, tagged "the contract"; inside, it orchestrates the writes to the object, updates the renamed field and maps the picklist values, so the rename is absorbed inside. Underneath: with the standard API, the other team must know your data model and change when it changes; with custom Apex REST, there is one endpoint, your own logging and orchestration, and code you maintain; decide in the first weeks. MIDDLEWARE TEAM SALESFORCE Middleware team builds Redrock's integration Work Order the object Status its picklist values Arrival_Window__c renamed in a release changed writes the object breaks uses the values Standard API: the other team must know your data model and change when it changes. Custom Apex REST: one endpoint, your own logging and orchestration, and code you maintain. Decide in the first weeks. HOW TO READ IT the contract Salesforce owns: a custom Apex REST endpoint © 2026 Twinshark LLC · stevetecharc.com
點擊放大

A release renames a field, and the integration breaks. ⟲

The other answer is a wrapper. In Salesforce that’s usually Apex: a class exposed as a REST resource, so external applications can call your code instead of your objects (Introduction to Apex REST (在新標籤頁中開啟), Apex Developer Guide, Winter ‘27, API version 68.0, checked 2026-10-27). Now you write your own REST contract, and the middleware team gets a single endpoint. Three things come with it: ⟲

  • Your own logging. You don’t depend only on the standard logs. Every incoming call can be timestamped and its payload recorded, so you can see exactly what arrived and replay it (module 3’s integration log). ⟲
  • Your own orchestration. One call can write the Work Order, its items and its status in the right order, inside Salesforce, instead of the middleware team making five calls and handling every partial failure. ⟲
  • A stable door. Rename a field, add an object, change a picklist value: you change the code behind the endpoint, and the contract stays the same. ⟲

The cost is real. It’s code, so it has to be built, tested and maintained by good Apex developers on the Salesforce side, and it still runs inside Salesforce’s limits: Salesforce’s guide says calls to Apex REST classes count against the org’s API limits and all standard Apex governor limits apply. Your team now owns part of the integration. ⟲

A contract between teams The middleware team on the left, Salesforce on the right with a Work Order object, a field, Delivery_Window__c, and the Status picklist values. First, with the standard API, the middleware team writes the object, writes the field and uses the picklist values directly. Then a release renames the field to Arrival_Window__c, tagged "changed", and the middleware team's arrow to it turns red with an X: it breaks. Last, with a custom API, the middleware team calls one endpoint, Manifest API v1, a custom Apex REST endpoint that Salesforce owns and that logs every call, tagged "the contract"; inside, it orchestrates the writes to the object, updates the renamed field and maps the picklist values, so the rename is absorbed inside. Underneath: with the standard API, the other team must know your data model and change when it changes; with custom Apex REST, there is one endpoint, your own logging and orchestration, and code you maintain; decide in the first weeks. {"author": "Steve Simpson", "blueprint": "1.0.0", "builder": "standard 1.46.0", "built": "2026-10-27", "id": "DGM-DA-DI-44", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "cells 0.3.0", "theme": "stevetecharc 1.4.0"} MIDDLEWARE TEAM SALESFORCE Middleware team builds Redrock's integration Work Order the object Status its picklist values Arrival_Window__c renamed in a release changed Manifest API v1 custom Apex REST; logs every call the contract one endpoint orchestrates inside updated inside maps inside Standard API: the other team must know your data model and change when it changes. Custom Apex REST: one endpoint, your own logging and orchestration, and code you maintain. Decide in the first weeks. HOW TO READ IT the contract Salesforce owns: a custom Apex REST endpoint © 2026 Twinshark LLC · stevetecharc.com
點擊放大

A custom Apex REST endpoint: Salesforce owns a smaller contract, logs every call, and the rename stays inside. We chose the custom contract on more than one project, because there was a lot of internal processing to hide. ⟲

So the question for the first week or two is about people as much as technology: will the external team know Salesforce deeply, and be quick to change when your data model changes? Or do you put a wrapper in front, and own it? Either answer can be right. What isn’t right is not deciding. ⟲

Test knowledge. Know when to expose a custom Apex REST endpoint instead of letting the other system call the standard APIs: to give an external team one stable interface, to orchestrate several writes inside Salesforce, or to log every call yourself. Know the cost too: code to maintain, and the org’s API and Apex governor limits still apply. Write it into the contract: which interface, who owns it, and who has to be told when something changes. That’s what the change line is for. ⟲

Volume: not “high.” High to one team is 10,000 a day, to another 100 million. Put numbers in: 1,100 deliveries a day, a set per distribution center each evening, 30% growth a year. Those numbers don’t only pick the mechanism; they shape storage, automation, locking, sharing, indexes, archiving, monitoring and retention. The contract connects integration volume back to data architecture. ⟲

Freshness: not “real time.” Write “a revision is on the Work Order within 15 minutes,” or “the partner’s manifest is in Salesforce at least a day before its delivery date,” or “finance reconciliation finishes each night before reporting starts.” Now it’s testable. “Real time” is an adjective; “within 15 minutes” is a requirement. ⟲

Key: not buried in the field mapping. Write the key field, whether it’s unique, who assigns it, and whether the relationship is really one-to-one. If one business thing has several external records, name the design: add records, not fields, as a hierarchy, peers or a child object (module 2 and chapter 6). Keys shouldn’t be an implementation surprise. ⟲

Write authority: maybe the most important data line. Not “objects: Work Order,” but “Redrock may write the items, the address and the delivery date; Salesforce owns the appointment, the crew and the route.” Now the integration can be tested against the authority model. If someone later adds the crew to Redrock’s payload, the contract asks: why? It becomes a governance control. ⟲

“But the integration user can edit it.” I don’t care. An integration user may have broad permissions because the implementation needs them; that doesn’t mean every integration using that identity should write every field it can. Permission says can; architecture says should. Good systems need both. And reading everything has a performance side too: Salesforce’s own case study of a slow integration user is in chapter 8 (When It’s Slow). ⟲

Proof of delivery: not “IT.” Name the side that knows what should arrive, and so proves it did (module 3). For C1 that’s Redrock, from Salesforce’s per-record results. For C2, status out, it’s Salesforce, with return receipts. For a scheduled pull, it’s the client that asks. The contract makes it explicit for each arrow. ⟲

Sensitivity and travel: not “secure.” Say what’s in the payload and how sensitive it is (C1 carries Recipient names, addresses and phone numbers), and every place it passes through: the integration layer, its logs, its retry queue. Data that must stay in a country has to travel there too. ⟲

Where the data travels Contract C1's path, with every place Recipient data rests. In the US: Redrock, with Recipient names, addresses and phone numbers, sends C1 manifests to the integration layer, which processes in the US and upserts into Salesforce, one US org; the integration layer keeps a copy of each payload in its integration log for 30 days. In another region: the integration layer parks failures in a retry queue hosted there, in coral and tagged "outside the boundary". Underneath: every place the data rests is a copy with a location; data that must stay in the US has to travel there too. {"author": "Steve Simpson", "blueprint": "1.0.0", "builder": "standard 1.46.0", "built": "2026-10-27", "id": "DGM-DA-DI-46", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "cells 0.3.0", "theme": "stevetecharc 1.4.0"} IN THE US ANOTHER REGION Redrock Recipient names, addresses, phone numbers Integration layer processes in the US Salesforce one US org Integration log every payload, kept 30 days Retry queue failed payloads, hosted in another region outside the boundary C1 manifests upserts a copy of each payload parks failures Every place the data rests is a copy with a location. Data that must stay in the US has to travel there too. HOW TO READ IT a copy outside the boundary © 2026 Twinshark LLC · stevetecharc.com
點擊放大

Every place the data rests is a copy with a location. Count the logs and the queues. ⟲

Change: not “we’ll coordinate.” Say how the contract evolves: new fields are added, never renamed; a breaking change gets a new version; the other side gets notice. A contract that can’t change safely will be broken quietly instead. ⟲

The implementation will have a field mapping too: Redrock’s field A to Salesforce field B, transformations, types, defaults. Useful. The contract sits a level above it: why the data moves, who owns it, how current, how much, how identified, who may change it, how the interaction is shaped, who proves it arrived. It gives the mapping its context. ⟲

The landscape holds Salesforce North America, Salesforce Europe and an acquired company’s org. Maybe we’re consolidating, syncing selected records, keeping some data local, or building a common customer or analytics layer. Don’t start with “how do we sync three orgs?” Start with the contracts. For each movement: what data, which direction, which org is authoritative, what’s the enterprise key, how current, what volume, why copy it, who may write it, who proves it arrived? That every box has a Salesforce logo doesn’t simplify the data questions. They’re still separate systems. Chapter 14 covers the multi-org patterns. ⟲

And sometimes the right contract says don’t move it. A large external dataset needed only occasionally, authoritative elsewhere, expensive to copy, changing constantly, mostly viewed? Why sync another copy? Virtualization may be better (Part 3). The contract forces that conversation because it asks why the copy exists. Remember FleetLink in module 1: C8 carries only the latest position, because the contract asked why 73 million readings a year would be copied at all. ⟲

The contract should also outlive the technology. ⟲

The contract survives the technology Redrock on the left, the integration layer in the middle, Salesforce's Work Orders on the right. First, Redrock's manifests go in through Middleware A, chosen at go-live, and are upserted into Salesforce; under the middleware sits contract C1: 15 minutes, the partner key, Redrock's fields, proof of delivery. Three years later, Middleware B replaces Middleware A, tagged "replaced", and carries the same manifests and upserts; contract C1 is tagged "unchanged". Underneath: the mechanism changes; the contract mostly survives; that's the sign you separated architecture from implementation. REDROCK INTEGRATION LAYER SALESFORCE Redrock manifests, REST API Middleware A chosen at go-live Contract C1 15 minutes · the partner key · Redrock's fields · proof of delivery Salesforce Work Orders manifests in upserts The mechanism changes; the contract mostly survives. That's the sign you separated architecture from implementation. HOW TO READ IT the contract: the architecture © 2026 Twinshark LLC · stevetecharc.com
點擊放大

At go-live: Middleware A, and contract C1. ⟲

Replace the middleware in three years, and Redrock still owns the items, the coordinator still needs revisions within 15 minutes, the key is the same, the volume is known, proof of delivery still matters. ⟲

The contract survives the technology Redrock on the left, the integration layer in the middle, Salesforce's Work Orders on the right. First, Redrock's manifests go in through Middleware A, chosen at go-live, and are upserted into Salesforce; under the middleware sits contract C1: 15 minutes, the partner key, Redrock's fields, proof of delivery. Three years later, Middleware B replaces Middleware A, tagged "replaced", and carries the same manifests and upserts; contract C1 is tagged "unchanged". Underneath: the mechanism changes; the contract mostly survives; that's the sign you separated architecture from implementation. {"author": "Steve Simpson", "blueprint": "1.0.0", "builder": "standard 1.46.0", "built": "2026-10-27", "id": "DGM-DA-DI-45", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "cells 0.3.0", "theme": "stevetecharc 1.4.0"} REDROCK INTEGRATION LAYER SALESFORCE Redrock manifests, REST API Middleware B three years later replaced Contract C1 15 minutes · the partner key · Redrock's fields · proof of delivery unchanged Salesforce Work Orders manifests in upserts The mechanism changes; the contract mostly survives. That's the sign you separated architecture from implementation. HOW TO READ IT the contract: the architecture © 2026 Twinshark LLC · stevetecharc.com
點擊放大

Three years later: new middleware, the same contract. ⟲

The mechanism changes; the contract mostly survives. That’s the sign you separated architecture from implementation. ⟲

We could fill in C2 to C9 now: status back to each partner, Keystone’s files, Brightwave’s EDI, FleetLink, Snowflake, the finance ERP. I’m deliberately leaving them for Checkpoint 2, where we take the Part 1 landscape and apply every design chapter of Part 2 to it. For now, you have the tool, and one finished example. ⟲

Beyond the exam: what AI changes. Don’t document an agent as “the agent has tools.” Each important action is an integration contract: which system it calls, what key identifies the record, what it may read and write, who owns those fields, the expected volume, what happens on retry or partial failure, what evidence is kept, how sensitive the data is and where it goes. A probabilistic caller is invoking deterministic enterprise operations, so keep identity, write authority, failure handling and observability outside the model’s discretion. ⟲

Once every important arrow has a contract, a review stops being “does the diagram look right?” and becomes: do we know the initiator and the data direction, is freshness measurable, do we know the zeros, is there a stable key, is authority explicit, does the pattern fit the requirement and the mechanism fit the pattern, who proves it arrived, where does the data travel, how will it change? If the answer to one is “we haven’t decided,” good: you found architecture work before production found it for you. ⟲

  • Which integrations are significant enough to need an explicit contract, and their numbers on the landscape. ⟲
  • The initiator, data direction, measurable freshness and Number of Zeros for each, before choosing technology. ⟲
  • 保持身分和主資料管理的跨系統鍵和欄位級寫入權限。
  • The pattern, the mechanism and who proves delivery for each direction. ⟲
  • How sensitive the data is, where it travels, and how the contract changes without breaking the other side. ⟲
  • 資料到底該不該流動,以及契約能否在技術更換之後依然有效。

A landscape simplifies complexity, which is useful, until an arrow hides the decisions that keep the data trustworthy. So draw the arrow, number it, then give it a contract you can check. Now it means something, and when the implementation changes, the architecture doesn’t disappear with it. That’s the difference between documenting an integration and designing the movement of enterprise data. ⟲