| D2 | Deploy as **Agentforce Employee Agents in Slack** | Slack is our surface; only Employee Agents deploy to Slack | `FACT` slack.com/help 36218109305875 |
| D3 | **Refine design.md §12**: remove `finance:read` from Lauren Exec; finance lookups go through the Finance agent | Gmail-read + finance-read + a write/egress tool in one session is the exfiltration trifecta | design.md §2.5, §3 (trifecta); §5 |
| D4 | **RESOLVED (2026-06-11, §0.1):** reach MCP tools via **GA External Service (OpenAPI) actions** (or Apex `@InvocableMethod`) authenticated by a **Per-User OAuth 2.1 Browser Flow External Credential → Cognito**. Native remote-MCP connector is NOT used for the per-user hop. | Per-user OAuth is GA; native custom-MCP per-user binding is unconfirmed and documented per-user identity exists only for SF-**hosted** MCP. Trade-off: lose the MCP transport on the Agentforce→tool hop (tools re-exposed as OpenAPI/Apex). | `FACT` research wf_1bf9e142; Named Credentials OAuth dev guide; G1/G2 §5 |
| D5 | **RESOLVED (2026-06-11, §0.1):** agent reasoning/planner model = **AWS-Hosted Claude (Salesforce-managed, on Bedrock)**. **BYOLLM is NOT used for the planner.** | BYOLLM is documented only for custom actions, never as a planner option, and routes back through Salesforce's Models API/Trust Layer anyway. AWS-Hosted is the only documented way to keep Claude as planner. | `FACT` research wf_1bf9e142; developer.salesforce.com supported-models |
| D6 | KB → **Agentforce Data Library (unstructured) on Data Cloud**, replacing Bedrock KB `LSDCNHTH6O` + AOSS | Data Libraries auto-create a Data Cloud search index + retriever; managed RAG | `FACT` Trailhead/Atrium Data Libraries; design.md §3 |
| D7 | **Retire**`po-sync` / `workorder-sync` KB feeds; structured WO/PO/payments stay **live MCP lookup tools** | Data Libraries are unstructured-only; structured data belongs in DDB-backed MCP tools | `FACT` Data Libraries unstructured-only; design.md §3 |
| D8 | Proactive jobs (`fetch-classify`, `daily-digest`, `reminder`, `notion-sync`) **stay as our scheduled Lambdas**, not Agentforce; HIGH-priority alerts continue as **Slack DMs** | No conversational equivalent; keeps Haiku classifier in our Bedrock account; cheapest reliable path | design.md §5; §1f below |
| D9 | New separate **`sh-agentforce` SFDX repo** for agent metadata (Bot/GenAiPlannerBundle/GenAiPlugin/GenAiFunction) under Agentforce DX | Different toolchain (sf CLI, scratch orgs, deploy-to-org) than the CDK monorepo; one deploy target per repo | `FACT` developer.salesforce.com Agent DX metadata; handbook |
| D10 | Build **Ops + Finance agents now**; HR/Gusto, SA8000 Q&A, IT/onboarding **later, corpus-gated**; add near-term capabilities as **Topics**, not new agents | Front/ops corpus is rich and current; HR/Amazon/SA8000 corpus is thin/stale/missing | Notion (below); design.md corpus notes |
| D11 | Keep the **Bedrock guardrail on the BYOLLM model path** + MCP-layer PII redaction (defense in depth) | Agentforce Trust Layer does not redact OUR tool-response payloads | design.md §2.5, §11.2 |
| D12 | **RESOLVED (2026-06-11, §0.1):****OpenAPI-first, MCP-ready transport-agnostic core.** Tool handlers + the shared auth/scope/PII/audit guard are built independent of transport; ship the **OpenAPI adapter now** (Agentforce External Service actions; Apex only where an action needs request/response shaping); **defer the MCP adapter** to a named trigger. | Agentforce's per-user hop needs OpenAPI regardless (D4); no committed MCP consumer today, so a second public interface + its conformance/hardening cost isn't justified yet; a transport-agnostic core makes the MCP adapter a cheap later add, not a re-platform; deferring it also drops the IDE-session trifecta nuance until then. | Adam 2026-06-11; research wf_1bf9e142 (D4) |
| 2. Reasoning model | **AWS-Hosted Claude (SF-managed)** as the planner. BYOLLM ruled out for the planner (only Salesforce Default / AWS-Hosted drive the Atlas reasoning engine; BYOLLM is custom-action-only and still routes through SF's Models API/Trust Layer). | research wf_1bf9e142 (Q2) |
| 4. Per-user auth path (D4) | **External Service (OpenAPI) / Apex actions + Per-User OAuth Browser Flow External Credential → Cognito.** Native remote-MCP connector is Beta and its per-user binding is unconfirmed — do NOT depend on it for the per-user hop. | research wf_1bf9e142 (Q1) |
| 5. Fund SA8000/handbook corpus (G8) | **DEFERRED — fund when needed** (not now). SA8000/compliance + HR agents stay blocked until content is authored; the agents must decline rather than hallucinate in the interim. | Adam, 2026-06-11 |
**Two consequences that ripple into the design (must be honored downstream):**
1.**The Agentforce→tool hop is NOT MCP.** Because per-user identity is only achievable on the GA External
Service/Apex action path (not the Beta MCP connector), Agentforce reaches our tools through an **OpenAPI/Apex
facade in front of each MCP server**, authenticated per-user to Cognito. The `sh-mcp-ops`/`-finance` servers,
their JWT validation, scopes, audience-binding, and PII redaction are **unchanged** — only the Agentforce-side
transport changes from MCP to OpenAPI/Apex actions. (Other MCP clients can still speak MCP to the same servers.)
Browser Flow requires an interactive first-auth per user (fine for Slack users; the proactive Lambdas in §1f
are unaffected — they use offline creds).
2.**Our Bedrock guardrail cannot sit on the planner path.** Both AWS-Hosted and BYOLLM keep Salesforce in the
inference path, so keeping inference + our own guardrail in account `328440206208` is **unsatisfiable on the
planner path today**. The Einstein **Trust Layer** covers planner-path moderation; **our guardrail + PII
redaction move entirely to the MCP/action layer** (already the plan for PII — design.md §2.5). This **revises
D11**: the guardrail is applied at the MCP/action layer, not "on the BYOLLM model path."
| **Dispatch / ops helpdesk** (Front workflow, tags/statuses, scheduling) | **NOW** | Topic in Seahaven Ops | RICH, CURRENT — Notion Front subtree: *Inboxes & How Email Flows*`33d2ecdd…8174`, *Dispatcher Workflow*`33d2ecdd…81f1`, *Scheduling Manager Workflow*`33d2ecdd…81d1`, *Tags & Statuses*`33d2ecdd…8169`, *Getting Started with Front*`33d2ecdd…810f`, *Tips & FAQ*`33d2ecdd…8134` |
| **Procurement / intake** (Customer Proposal Request, Invoice Payment Submission) | **NOW (read), Later (write)** | Topic in Seahaven Ops; intake *answers* now, intake *actions* via Flow later | Intake SOPs exist in Notion; the write paths are today Slack workflows |
| **SA8000 / labor-compliance Q&A** | **LATER — blocked pending content** | Topic in Seahaven Ops once sourced | SA8000 docs **not found in Notion** (design.md corpus gap; Gap G8) — author + ingest first |
| **HR / IT onboarding-offboarding** | **LATER — blocked pending content** | Topic in Seahaven Ops, or its own agent if PII-heavy | Notion *Departments & Roles* + HR onboarding pages are near-empty stubs (design.md) |
| **Gusto-backed HR / payroll self-service** | **LATER — new agent + new tier** | New **`sh-mcp-hr`** server + `hr:self`/`hr:read` tier + **Seahaven HR** agent | Employment-of-record is **Nacre Ventures Inc.** (W2), operating brand is Sea Haven — the agent must state this correctly; PII-heavy, warrants its own audited tier |
| **Amazon AMOC / Site-Lead ops** | **LATER — content stale + access-restricted** | Topic, audience-restricted | Amazon subtree is THIN/STALE ("migrated from BookStack"): *Operations (Amazon)*`33a2ecdd…8118`, *AMOC*`33a2ecdd…8162` (comms restricted to Adam & Robert), *Site-Lead*`33a2ecdd…8166` |
`ASSUMPTION`: the highest near-term ROI is the dispatch/ops helpdesk Topic, because the Front corpus is the
single richest, most current body of SOPs we have. SA8000/HR agents are *demand-real but supply-blocked* on
content — calling them out now lets us fund authoring in parallel (Gap G8).
### 1c. MCP functionality to ADD beyond the legacy agents
Each new capability tagged trust tier + scope + outbound-auth, consistent with design.md §2–§3:
| New tool / server | Tier | Scope | Outbound auth | Build window |
| **`sh-mcp-hr`** (Gusto): `get_my_paystub`, `get_pto_balance`, `list_benefits` (self-service) | new `hr` | `hr:self` | service creds (Gusto API token, Secrets Manager); ABAC-partitioned by `sub` like Gmail | Later (corpus + Gusto API) |
| **Front read tools** in `sh-mcp-ops`: `lookup_front_conversation`, `get_sla_status` | ops | `ops:read` | service creds (Front API key) | Optional add — design.md §9 deliberately excluded Front at launch; add only if dispatch Topic needs live conversation state |
| **Procurement intake writes**: `submit_proposal_request`, `submit_invoice_payment` | ops | `ops:tasks` | service creds (DDB/Front) **or** Agentforce **Flow** action | Later; today these are Slack workflows |
| **WO comment free-text search** (replaces a lost KB feature, see D7) | ops | `ops:read` | service creds (DDB / a small text retriever) | Optional — see Gap G4 |
Physical tier (`physical:*`) remains **deferred / admin-out-of-band**, no scope issued to any agent
(design.md §3, §6). Unchanged.
### 1d. AI models — which, and where
`FACT` (developer.salesforce.com supported-models; Salesforce "Agentforce 360 for AWS"; Salesforce×Anthropic
Oct-2025 partnership): Agentforce's **Atlas reasoning engine is model-agnostic**; the default is a
Salesforce-managed mix (incl. GPT-4o); an **AWS-Hosted option runs Anthropic Claude Sonnet 4 on Amazon Bedrock**
and can power Atlas; **BYOLLM** (Models API) supports **Amazon Bedrock, Azure OpenAI, OpenAI, Vertex**, runs on
your own credentials/instance, keeps the **Trust Layer**, and consumes **~30% fewer Einstein Requests**.
**Decision (D5):**
- **Agent reasoning / planner model = Anthropic Claude on Bedrock.** Preferred path: **BYOLLM pointed at our
Bedrock** (account `328440206208`, `us-east-1`) so inference stays in our trust boundary, we keep our own
guardrail on the model path (D11), and we cut Einstein-Request spend. **Gap G6:** confirm a BYOLLM endpoint can
be the *agent reasoning model* (Atlas planner), not only a prompt-template/Models-API call. If not, fall back
to the **AWS-Hosted Claude Sonnet 4** managed option (confirmed to power Atlas) — same model family, less
control. Either way we retain the Claude lineage of the legacy bots (Sonnet 4.5 for Alex, Sonnet 4.6 for
Lauren's conversation loop).
- **Classification stays out of Agentforce.** The 15-min `fetch-classify` job keeps using **Bedrock Haiku 4.5**
in our account (design.md §5, D8). It is proactive/event-driven, has no conversational surface, and shouldn't
consume Einstein Requests.
- **Per-agent model selection** is set in Setup → Agentforce Agents (`FACT`). All three agents use the same
Claude reasoning model; Finance's lower latency tolerance is fine.
- Licensing/capability flag: BYOLLM and Data Cloud both carry consumption/licensing cost (Gap G9, O5).
content to **Data Cloud**, which **auto-creates a search index** (chunked + vectorized) **and a retriever**
(the link between prompt and index). **Data Libraries support UNSTRUCTURED data only.**
**Design:**
| Corpus | → Data Library | → Retriever | Notes |
|--------|----------------|-------------|-------|
| Notion How-To/Front SOPs + intake SOPs (unstructured) | **Seahaven Ops Knowledge** | `Seahaven_Ops_Knowledge_Retriever` | Highest-value, current. Source via `notion-sync` repointed to Data Cloud ingestion (S3 → Data Cloud, or Notion connector) |
| Amazon/AMOC subtree (unstructured, **stale**) | same library, separate index segment or tagged | same | Audience-restrict AMOC content; flag staleness (Gap G7) |
| SA8000 docs + employee handbook + company policies | **must be authored**, then ingested | same | **Not in Notion** (Gap G8) — stage in `s3://seahaven-kb-docs-328440206208` or Drive, then ingest |
| WorkOrders / purchase-orders / SiteAssignments / payments (**structured, live**) | **NOT a Data Library** | n/a | Stay **MCP lookup tools** over DDB (design.md §3); Data Libraries can't hold structured data (D7) |
**Relationship to the legacy Bedrock KB + 3 sync jobs (D6/D7):**
- The **Bedrock KB `LSDCNHTH6O`** + **OpenSearch Serverless `gv1540frh1crb79gtr4b`** + **Titan Embed V2** are
**replaced** by the Data Cloud search index + Salesforce-managed embeddings. (We lose control of the embedding
model — Gap G5, low.)
- **`notion-sync`** is **kept but repointed**: Notion → Data Cloud ingestion (instead of Notion → S3 → Bedrock
KB). Still a scheduled Lambda in `sh-mcp/jobs` (design.md §5).
- **`po-sync` / `workorder-sync` are retired** as KB feeds: POs/WOs are structured and are served live by the
MCP lookup tools, not searched as text. The only thing lost is free-text search over WO *comments* that Alex's
KB allowed — Gap G4 (low; workaround: a small dedicated retriever or `lookup`-by-id only).
**SA8000 / handbook sourcing gap (explicit):** these are referenced as KB inputs but were **not found as Notion
pages** (design.md corpus notes). Resolution: **author them** (Jira stories §4), stage in S3/Drive, ingest into
the Seahaven Ops Knowledge Data Library. **Until authored, SA8000/handbook Q&A is BLOCKED** (Gap G8) — the agent
must say it cannot answer rather than hallucinate, and SA8000-misconduct questions must not be suppressed (legacy
guardrail set MISCONDUCT output to MEDIUM precisely so they aren't — design.md/legacy Alex guardrail).
### 1g. Agentforce DX
`FACT` (developer.salesforce.com Agent DX metadata; "New Agentforce Metadata and Development Lifecycle", May
2026): agents are metadata — **Bot + BotVersion** + a single **GenAiPlannerBundle** per agent (container for
subagents/actions) + **GenAiPlugin** per Topic/subagent + **GenAiFunction** per custom action +
**GenAiPromptTemplate**. Agentforce DX = sf CLI + VS Code extension + Agentforce Vibes IDE; supports scratch
orgs, sandboxes, and VCS as source of truth.
**Decision (D9):** create a **separate `sh-agentforce` SFDX repo** under the GitHub org, NOT a folder in the
CDK monorepo — the toolchains are disjoint (sf CLI / metadata deploy-to-org vs `cdk deploy` to AWS), and the
handbook is one-deploy-target-per-repo. Coexistence:
- *(Proactive digest + 15-min HIGH-priority classification are NOT topics here — they remain scheduled
Lambdas that DM the user; D8, design.md §5.)*
---
## 3. Migration & cutover plan
Follows design.md §6 phasing; each legacy bot is deprecated **only at proven parity** (golden-transcript gate,
§1h).
| Phase | Work | Parity / exit gate | Rollback |
|-------|------|--------------------|----------|
| **0 — Foundation** | Stand up Cognito + Google federation + pre-token + 5-min group-sync (design.md §6.1). Create `sh-agentforce` SFDX repo + `cd-sfdx` reusable workflow (Gap G10). Stand up the Data Cloud org + **Seahaven Ops Knowledge** Data Library; repoint `notion-sync`. Decide D4 wrapper (Apex/External Service per-user named credential vs native MCP connector) after verifying G1/G2. | SSO login end-to-end; per-user JWT reaches a smoke-test MCP tool carrying the real `sub`; Data Library retriever returns Front SOP answers. | N/A (legacy still running) |
| **1 — Seahaven Ops** | Wire Ops agent → `sh-mcp-ops`; vendors (KB/Maps) + WO/PO/site + knowledge + tasks. | Behavioral suite + golden-transcripts vs **Alex** green; per-user auth + tool-hiding verified at MCP layer. | Keep Alex running in parallel; flip Slack default back to Alex. |
| **2 — Seahaven Finance** | Wire Finance agent → `sh-mcp-finance`; full audit logging; 15-min TTL + deny-list. | Audit records emitted; PII-redaction tests green; audience-binding rejection verified. | Finance lookups revert to Alex's QBO action group temporarily. |
| **G1** | **RESOLVED 2026-06-11 (research wf_1bf9e142).** Per-user OAuth Browser Flow on the **native custom remote-MCP connector is unconfirmed**; documented per-user identity exists only for SF-**hosted** MCP. | **C→ mitigated** | If we'd relied on the MCP connector and it bound only a Named Principal: per-user `sub`, ABAC Gmail isolation, and trifecta all break. | **Decided (D4):** do NOT use the native MCP connector for the per-user hop. Use **GA External Service (OpenAPI)/Apex actions + Per-User OAuth Browser Flow External Credential → Cognito** (per-user OAuth is GA, ships in `UserExternalCredential`). | In-org: build one ES action on a Per-User Browser Flow cred → confirm first-call consent, real `sub` reaches the server, and token auto-refresh (§6 verify list) |
| **G2** | **RESOLVED 2026-06-11.** Custom remote MCP client is **Beta** (Pilot Jul 2025 → Beta Jan 2026); SF-*hosted* MCP is GA (Apr 2026) but that's not our remote servers. | **C→ avoided** | Schedule/stability risk on the native-MCP path. | **Avoided by D4** — the GA ES/Apex action path is the per-user transport; the Beta MCP connector is off the critical path. Revisit native MCP once remote-MCP per-user binding reaches GA. | SF release notes for remote-MCP GA date |
| **G3** | **Trust Layer masking may over-mask.** Agentforce Trust Layer can mask PII; legacy Alex **deliberately left vendor names/contacts unmasked** (lookup is the bot's job). | M | Vendor lookups could be degraded if Trust Layer masks names. | Configure Trust Layer masking to exclude names/contacts; keep MCP-layer redaction authoritative for bank/routing/card/SSN (design.md §2.5). | Trust Layer data-masking config |
| **G4** | **Loss of free-text search over WO comments** (old KB feature) — Data Libraries are unstructured-only, WO/PO are structured MCP lookups. | L | Can't fuzzy-search WO comment text. | Lookup-by-id via MCP tools; or a dedicated retriever over a comment text export if demand appears. | — |
| **G5** | **Embedding model not selectable** — Data Cloud uses Salesforce-managed embeddings (vs legacy Titan Embed V2 1024-dim). | L | Less control over retrieval tuning. | Accept managed embeddings; tune chunking. | Data Cloud index config options |
| **G6** | **RESOLVED 2026-06-11 (research wf_1bf9e142): BYOLLM cannot drive the planner.** Only Salesforce Default / AWS-Hosted options drive the Atlas reasoning engine; BYOLLM is custom-action-only and still routes through SF's Models API/Trust Layer. | M→ resolved | Our-account inference + our guardrail are **unsatisfiable on the planner path**. | **Decided (D5):** use **AWS-Hosted Claude** as the planner; move our guardrail + PII redaction to the **MCP/action layer** (revises D11); rely on the Trust Layer for planner-path moderation. Note AWS-Hosted model is drifting Sonnet 4 → 4.6/Haiku 4.5 (May 2026). | In-org: confirm the reasoning-model selector offers only Default/AWS-Hosted; confirm current AWS-Hosted model name |
| **G7** | **Amazon/AMOC corpus is stale** ("migrated from BookStack, may need updating") and access-restricted (AMOC comms = Adam & Robert only). | M | Agent could give outdated Amazon-site guidance. | Audience-restrict the AMOC topic; flag content as stale; re-author before exposing widely. | Notion *AMOC*`33a2ecdd…8162` currency |
| **G8** | **SA8000 docs + employee handbook + company policies missing** from Notion (referenced as KB inputs, not found). | M | SA8000/compliance + HR Q&A **blocked**. | **Blocked pending content authoring** — author, stage in S3/Drive, ingest into Ops Knowledge Data Library; until then the agent must decline (without suppressing legitimate misconduct questions). | design.md corpus notes; locate any S3/Drive originals |
| **G9** | **Agentforce + Data Cloud licensing / Einstein-Request consumption.** | M | Cost; BYOLLM cuts ~30% of Einstein Requests but Data Cloud + Agentforce licensing still applies. | Budget; BYOLLM to reduce request spend. | Salesforce contract / Einstein Request limits |
| **G10** | **No SFDX reusable CI/CD workflow** — org reusable workflows are AWS/CDK/OIDC-shaped (design.md §7.1). | M | `sh-agentforce` can't deploy via the existing pattern. | Author a new reusable **`cd-sfdx`** workflow (deploy-then-merge, scratch-org validate). | handbook `cicd.md` |
| **G11** | **Two access-control planes.** Agentforce-in-Slack assigns member access via **Salesforce permissions**; our authz is **Google Groups → Cognito → scopes**. | M | Drift: a user could see an agent but lack the MCP scope, or vice-versa. | Provision Agentforce/Salesforce user access **from the same Google Groups** (SCIM/identity sync) so Google Groups stays the single source of truth (design.md §2.3). | Salesforce SCIM/Google provisioning |
`FACT` for G1/G2: Agentforce MCP support (Pilot Jul 2025, Beta Jan 2026; SF-hosted MCP GA Apr 2026; OAuth 2.0,
JSON-RPC over Streamable HTTP) and Named/External Credential **Per User** identity type — verified via Salesforce
sources (§Sources). The **specific** per-user binding for MCP connectors is the unverified piece, hence the gap.
---
## 6. Open decisions for Adam (with recommendation)