# CLAUDE.md Guidance for Claude Code working in this repo. Read this first. ## What this is A **demo** (not production) of a reversible PII de-identification round trip for HNCB: advisor query with a real name → tokenized before it leaves for the cloud → Amazon Bedrock AgentCore agent reasons on tokens only → identity restored on-prem before the advisor sees the answer. Everything runs in **one AWS account**; "on-prem" is a logical, tag-labelled zone standing in for the branch data centre. The demo proves data-flow behaviour, not physical residency. ## Critical context - **Fusion is a shared SaaS instance. DO NOT build, host, or Terraform it.** It is configured in the Amplify AI Gateway console (see `fusion/POLICY_SETUP.md`). Because it is SaaS, anything it calls must be a **public HTTPS endpoint with auth** — it cannot reach private VPC resources or use local AWS creds. - This means the AWS side's job is to expose two endpoints Fusion will call: **`/tokenize`** (ingress) and **`/restore`** (egress), plus host the detector, vault, RAG tool, and agent. See the task backlog below. - **Detection ≠ redaction.** The detector returns typed findings; our code owns minting tokens, writing the vault, and restoring. Never redact-and-discard. - Tokens must be **random per request** and stored in the vault keyed by session. ## Architecture (maps to the customer's 8 steps) Advisor UI → **Fusion SaaS** → [`/tokenize`: detect (Presidio) + mint + vault-write] → AgentCore Runtime (Bedrock model) → tool call via AgentCore Gateway → RAG Lambda (resolve token → de-identified evidence) → agent talking points → **Fusion SaaS** → [`/restore`: vault lookup] → Advisor UI. ## Repo map ``` terraform/ DynamoDB (vault + customers), RAG Lambda, IAM, Presidio hosting lambda_rag/ RAG tool (real): token resolve -> evidence package gateway_api/ TODO: /tokenize and /restore HTTPS endpoints Fusion calls (T1, T2) agent/ Strands agent for AgentCore Runtime + tool schema presidio/ detector service (typed findings) + Dockerfile seed/ fake customer (Wang Xiaoming) + seed script ui/ advisor UI (restored-vs-tokenized split view) scripts/ deploy.sh, agentcore_setup.sh, teardown.sh fusion/ POLICY_SETUP.md (SaaS console config — human does this, not you) ``` ## Commands - Deploy core infra: `bash scripts/deploy.sh` (review first) - Seed data: `VAULT_TABLE=... CUSTOMERS_TABLE=... python seed/seed.py --with-demo-token` - AgentCore: `bash scripts/agentcore_setup.sh` (verify against `agentcore --help`) - Teardown (do this to stop spend): `bash scripts/teardown.sh` - Terraform: run all `terraform` commands with `-chdir=terraform`. ## Conventions & guardrails - Region default `us-east-1` (best Bedrock/AgentCore quotas). Keep it a variable. - **Never commit AWS creds, tokens, or real PII.** Seed data is synthetic only. - Python: standard library + boto3; keep handlers small and dependency-light. - Pin `bedrock-agentcore` / `strands-agents` versions before `agentcore launch` — these SDKs move fast; verify signatures against installed versions, don't assume. - Prefer Lambda Function URLs (with auth) or API Gateway for the public endpoints. - After any infra change, remind the human to `teardown` when done recording. ## Task backlog (pick these up) Each task: keep it demo-grade, add a note in the file, and update this list. - **T1 — `/tokenize` endpoint** (`gateway_api/tokenize/`). HTTPS endpoint Fusion calls with `{query}`. Steps: POST query to Presidio `/analyze`; for each finding mint a random token (`CUST_` for PERSON→customer, `TW_` for TW_ROC_ID); write vault items `{token, type, value, session_id, expires_at}`; splice tokens into the text. Return `{deidentified_prompt, session_id}`. *Accept:* real name in → tokenized text + session_id out; vault rows written; same input yields different tokens on repeat calls. - **T2 — `/restore` endpoint** (`gateway_api/restore/`). Input `{session_id, text}`. Look up this session's tokens in the vault, re-attach identity (envelope-level: prepend the real name; also swap any inline tokens). Return `{final}`. *Accept:* tokenized answer + session_id → answer with `王小明` restored. - **T3 — reachability from SaaS.** Make Presidio (or fold detection into T1 so only `/tokenize` + `/restore` are public) reachable from Fusion SaaS with auth. *Accept:* Fusion SaaS can call the endpoints over HTTPS; nothing else is public. - **T4 — AgentCore Gateway target.** Wire the RAG Lambda as the MCP tool; confirm the agent can call `get_customer_activity_summary(CUST_000123)` and get the package. *Accept:* a manual `agentcore` invoke returns the evidence package. - **T5 — Agent runtime.** Pin deps, `agentcore launch`, capture the Runtime ARN. *Accept:* invoking the runtime with a tokenized prompt returns talking points. - **T6 — UI wiring.** Point `ui/index.html` GATEWAY_URL at the Fusion SaaS entry (or `/tokenize` for a Fusion-less dry run); host on S3+CloudFront. *Accept:* the split view renders restored vs tokenized. - **T7 — E2E rehearsal.** Run the full script in README; confirm the Bedrock/ AgentCore trace shows only tokens. Then verify `teardown.sh` leaves nothing paid-for. ## Known caveats (don't "fix" these silently) - zh-TW detection is demo-narrow (tuned to the scripted entities), not production recall. - The agentic token-resolution loop (T4) is custom orchestration by design. - If you touch `fusion/`, it's documentation for a human — do not try to automate SaaS config.