salesforce-flow-debugger-skill
Hybrid T0/T1 skill that diagnoses Salesforce Flow failures. Works in two modes:
- T0 mode (default): Takes a pasted Flow error message or pasted Flow
Interview log export. No org connection needed.
- T1 mode (optional): Fetches the Flow definition via
sf org list metadata and queries FlowInterviewLog records via
sf data query to retrieve live failure context.
Identifies the failing node, root cause, fix recommendation, and fault path
design guidance. Outputs a structured diagnosis with an audit envelope.
When This Skill Owns the Task
Use salesforce-flow-debugger-skill when the work is to diagnose why
a Flow failed or is not working:
- "My Flow failed with: 'This record failed to save because...'"
- "Here's the Flow Interview log — what went wrong?"
- "Why does my Account Before-Save Flow throw a null pointer on the Decision node?"
- "Flow: Order Notification fails on Send Email Action with UNHANDLED_FAULT"
- "How do I add a fault path to prevent this error?"
Delegate elsewhere when:
| Situation |
Skill to use |
| Building a new Flow from scratch |
generating-flow (sf-skills) or MCP pipeline |
| Static review of Flow configuration and best practices |
salesforce-flow-automation-review-skill |
| Deploying a fixed Flow to another org |
salesforce-deployment-validator-skill |
| Apex exception inside a Flow-invoked Apex action |
salesforce-apex-log-analyzer-skill |
Required Context to Gather First
Before diagnosing, gather:
- Error message text — the exact error string from the flow failure
notification, debug log, or Flow Interview log entry.
- Flow API name — the developer name of the failing Flow, if known.
- Flow type — Screen Flow, Auto-launched Flow, Record-Triggered Flow,
Scheduled Flow, or Subflow.
- Trigger context — what action or event triggered the Flow? User
action, record save, scheduled batch, or REST API call?
- Failing node name — the element name (if visible in the error or
the Flow builder debug view).
- Org type — sandbox or production. Production errors require stricter
redaction.
- Recent changes — was the Flow recently modified or deployed?
What changed?
In T1 mode, additionally confirm:
- Target org alias recognized by
sf org list
- Org is sandbox (T1 mode is restricted to sandbox for live log fetch)
Recommended Workflow
Step 1 — Parse the error message
Extract from the error text:
- Fault type — UNHANDLED_FAULT, NullPointerException, DML Exception,
Governor Limit, Type Mismatch, Recursive Flow
- Failing element — the element name or API action mentioned
- Variable state context — any variable values or record ID fragments
in the error (mask immediately per redaction rules)
- Stack trace — if present, extract the top frame
Apply redaction (see Redaction Rules) before continuing analysis.
Step 2 (T1 mode only) — Fetch Flow metadata
sf org list metadata \
--metadata-type Flow \
--target-org <alias>
Filter for the failing Flow by API name. Use the result to confirm the
Flow version deployed and retrieve the element count.
Step 3 (T1 mode only) — Query FlowInterviewLog
sf data query \
--query "SELECT Id, FlowApiName, InterviewLabel, CurrentElement, ErrorCode, ErrorMessage, StartTime, EndTime FROM FlowInterviewLog WHERE FlowApiName = '<FlowApiName>' AND Status = 'Fault' ORDER BY StartTime DESC LIMIT 10" \
--target-org <alias> \
--result-format json
Redact all record IDs and variable values before analysis.
Note: FlowInterviewLog and FlowInterviewLogEntry are available
in orgs with Flow Interview Logging enabled (must be activated in Setup →
Process Automation Settings).
Step 4 — Classify the root cause
Map the parsed error to a root cause pattern
(see references/flow-error-patterns.md):
| Error pattern |
Root cause category |
UNHANDLED_FAULT on Action element |
Missing fault connector on the action |
NullPointerException on Assignment |
Variable used before being set; loop ran zero iterations |
DML Exception on Update Records |
Validation rule blocked the save; trigger re-entry; locked record |
EXCEEDED_ID_LIMIT or TOO_MANY_SOQL_QUERIES |
DML or SOQL inside a loop |
INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY |
Running user lacks object or record access |
FLOW_LOOP_COUNT_LIMIT |
Recursive Flow invocation; self-trigger via record update |
INVALID_TYPE or WRONG_CONTROLLER_STATE |
Merging incompatible variable types in an Assignment |
| Subflow not found |
Subflow version not active or not deployed in this org |
Step 5 — Generate specific fix recommendation
For each root cause, generate:
- Immediate fix — what to change in the Flow builder right now
- Fault path recommendation — should a fault connector be added?
Where should the fault path go? (See
references/fault-path-design.md)
- Null guard — if null variables are involved, where should the
null check Decision element be placed before the failing element?
- Data type fix — if type mismatch, what types need to match and how
to add an explicit conversion or intermediate variable
Step 6 — Emit structured diagnosis with audit envelope
Produce the full output block per the Output Format section below.
Quality Scoring Rubric (100-point)
Score every diagnosis before emitting. Threshold: 80+ ship, 60–79 ship
with caveat, below 60 reject and request more context.
| Dimension |
Points |
What earns full marks |
| Root cause clarity |
30 |
Specific error type identified; failing element named; cause-and-effect chain explained in plain language |
| Fix suggestion specificity |
25 |
Tells admin which element to click, which property to change, and what value to set — not "check the data" |
| Fault path recommendation |
20 |
Recommends adding fault connector where missing; describes where fault path should end (screen, log, email) |
| Data type analysis |
15 |
Identifies mismatched variable types; names correct types and where to set them |
| Redaction quality |
10 |
All record IDs, variable values, and user IDs masked in output and audit envelope |
Scoring penalties:
- Generic recommendation ("check the error") with no specific element: -25
- Missing fault path guidance when UNHANDLED_FAULT is the error type: -20
- Unredacted record ID or user ID in output: -30 (immediate caveat)
- Incorrect fault type classification: -20
T0/T1 Contract
T0 Mode (default, no org connection)
- Takes pasted error message or pasted FlowInterviewLog export as input.
- All analysis is static — no org connection.
allowed-tools: Read Grep Glob only.
- No
sf CLI commands executed.
T1 Mode (optional, read-only runtime)
- Activates when user confirms org alias and explicitly requests live
log fetch.
- OAuth scopes:
api and refresh_token only.
- Run As permissions:
View Setup and Configuration, View Setup.
- Denied:
ModifyAllData, ViewAllData, ViewEncryptedData,
ModifyMetadata, AuthorApex.
- Restricted to sandbox orgs — do not query FlowInterviewLog on
production in T1 mode without explicit user confirmation and production
safety review.
- Maximum query: 10 most recent fault records. No bulk log extraction.
Refusal Triggers
Stop and decline if:
- The request is to write a new Flow from scratch (out of scope).
- The request is to deploy the fixed Flow to a production org (route to
salesforce-deployment-validator-skill).
- In T1 mode: target org appears to be production and user has not
explicitly confirmed the production safety review step.
- The audit envelope cannot be populated in T1 mode (org alias
unresolvable, flow name missing).
- The user requests that redaction be skipped.
Audit Envelope Schema
Every T1 execution emits an audit envelope. T0 mode emits a reduced
envelope (no org fields).
audit_envelope:
matter_id: "<caller-provided-or-generated-uuid>"
skill_id: "salesforce-flow-debugger-skill"
skill_version: "0.1.0"
mode: "<T0-static | T1-live>"
target_org_alias: "<alias or 'N/A for T0'>"
flow_api_name: "<FlowApiName>"
flow_type: "<RecordTriggered|Screen|AutoLaunched|Scheduled>"
run_as_user_id: "<user_id_placeholder>"
log_records_queried: <integer or 0 for T0>
redactions_applied:
- field: "<FieldOrVariableName>"
reason: "<record_id|user_id|variable_value|pii>"
timestamp: "<ISO-8601-UTC>"
org_type_verified: "<sandbox | production | N/A for T0>"
Output Format
verdict: "diagnosis-complete | needs-more-context | reject"
quality_score: <0-100>
quality_notes: "<what drove the score>"
diagnosis:
flow_api_name: "<FlowApiName or 'unknown'>"
flow_type: "<type>"
error_type: "<UNHANDLED_FAULT|NullPointerException|DML Exception|Governor Limit|Type Mismatch|Recursive|Other>"
failing_element_name: "<ElementName or 'unknown'>"
failing_element_type: "<Action|Decision|Assignment|Loop|GetRecords|UpdateRecords|Screen|Subflow>"
root_cause_summary: "<1-2 sentence plain-language explanation>"
root_cause_detail: "<technical detail with element names and variable context>"
fix_recommendation:
immediate_fix: "<specific steps in Flow Builder>"
fault_path_required: <true|false>
fault_path_design: "<where to add it and where it should terminate>"
null_guard_required: <true|false>
null_guard_placement: "<before which element and what Decision logic>"
data_type_fix: "<if type mismatch: what types, where to add intermediate variable>"
governor_limit_fix: "<if governor limit: what to move outside the loop>"
fault_path_template:
trigger: "<which element needs the fault connector>"
fault_variable_capture: "<Fault Message variable assignment>"
fault_path_ends_at: "<Screen|Custom Notification|Log to Custom Object|Email>"
sample_fault_message_variable: "{!$Flow.FaultMessage}"
redaction_log:
- "<description of what was masked>"
audit_envelope:
<see Audit Envelope Schema>
escalation_triggers_fired:
- "<trigger name or 'none'>"
missing_evidence:
- "<what additional context would improve the diagnosis>"
assumptions:
- "<explicit list of assumptions made>"
Redaction Rules
Apply in order. Do not bypass for any reason.
- Salesforce Record IDs (15/18-char): Replace with
<record_id_placeholder> anywhere they appear in error messages or
log entries.
- User IDs (OwnerId, CreatedById, RunningUserId in logs): Replace
with
<user_id_placeholder>.
- Flow variable values that may contain PII (email, phone, name,
address): Replace with
<variable_value_redacted>.
- Org IDs (18-char starting
00D): Replace with
<org_id_placeholder>.
- OAuth tokens, session IDs: Strip entirely — never include in output.
- Instance URLs: Replace with
<org_instance_placeholder>.
- Stack trace class paths containing customer namespace: Preserve
class names but redact any embedded record IDs or data values.
Document each redaction in redaction_log.
Handoff Rules
| Situation |
Hand off to |
| Fix requires Apex action code change |
salesforce-apex-log-analyzer-skill |
| Fix requires Flow deployment to new org |
salesforce-deployment-validator-skill |
| Flow passes but underlying permission is wrong |
salesforce-permission-model-review-skill |
| Static quality review of the Flow design |
salesforce-flow-automation-review-skill |
| Flow governs a business-critical process needing production change |
salesforce-live-guard-agent |
Stop Conditions
- Target org is production and T1 mode was requested without explicit
production safety acknowledgment — stop and require acknowledgment.
- FlowInterviewLog object is not queryable (Flow Interview Logging not
enabled in org) — stop T1 fetch, fall back to T0 mode with error message.
- Error message contains no element name and no variable context — request
additional pasted context (full error text, Flow debug log) before
proceeding.
- User requests to run a DML fix directly in T1 mode — refuse; route to
human-approval path via
salesforce-live-guard-agent.
Security Notes
- T1 read-only operational: Queries
FlowInterviewLog only. No DML,
no metadata mutation, no Apex execution.
- Sanitized output only: All record IDs, user IDs, and variable values
redacted before emission.
- Sandbox-preferred for T1: Production FlowInterviewLog access requires
explicit user confirmation and applies stricter redaction.
- Structured audit emitted: Every T1 execution produces a complete audit
envelope.
- Least-privilege Run As account: No Modify All Data, View All Data,
View Encrypted Data, or Modify Metadata.
Reference File Index
| File |
When to read |
references/flow-error-patterns.md |
Common Flow errors and their root causes |
references/fault-path-design.md |
When and how to add fault connectors |
references/interview-log-redaction.md |
Sanitizing FlowInterviewLog output |
1---2name: salesforce-flow-debugger-skill3description: Diagnoses Salesforce Flow failures from pasted error messages or (in T1 mode) live Flow Interview logs fetched via sf CLI. Identifies the failing node, root cause, and provides specific fix recommendations including fault path design, data type corrections, and null handling. TRIGGER when: user says debug this flow error, flow failed with, flow interview error, why did my flow fail, flow is not working, flow throws error, flow interview fault. Trigger phrases: flow error, interview log, fault path, flow failed on. DO NOT TRIGGER when: writing new flows from scratch (route to generating-flow skill), reviewing static Flow configuration for quality (use salesforce-flow-automation-review-skill), deploying Flows to a new environment (use salesforce-deployment-validator-skill).4license: MIT5---67# salesforce-flow-debugger-skill89Hybrid T0/T1 skill that diagnoses Salesforce Flow failures. Works in two modes:1011- **T0 mode (default):** Takes a pasted Flow error message or pasted Flow12 Interview log export. No org connection needed.13- **T1 mode (optional):** Fetches the Flow definition via14 `sf org list metadata` and queries `FlowInterviewLog` records via15 `sf data query` to retrieve live failure context.1617Identifies the failing node, root cause, fix recommendation, and fault path18design guidance. Outputs a structured diagnosis with an audit envelope.1920## When This Skill Owns the Task2122Use `salesforce-flow-debugger-skill` when the work is to **diagnose why23a Flow failed or is not working**:2425- "My Flow failed with: 'This record failed to save because...'"26- "Here's the Flow Interview log — what went wrong?"27- "Why does my Account Before-Save Flow throw a null pointer on the Decision node?"28- "Flow: Order Notification fails on Send Email Action with UNHANDLED_FAULT"29- "How do I add a fault path to prevent this error?"3031**Delegate elsewhere when:**3233| Situation | Skill to use |34|---|---|35| Building a new Flow from scratch | `generating-flow` (sf-skills) or MCP pipeline |36| Static review of Flow configuration and best practices | `salesforce-flow-automation-review-skill` |37| Deploying a fixed Flow to another org | `salesforce-deployment-validator-skill` |38| Apex exception inside a Flow-invoked Apex action | `salesforce-apex-log-analyzer-skill` |3940---4142## Required Context to Gather First4344Before diagnosing, gather:45461. **Error message text** — the exact error string from the flow failure47 notification, debug log, or Flow Interview log entry.482. **Flow API name** — the developer name of the failing Flow, if known.493. **Flow type** — Screen Flow, Auto-launched Flow, Record-Triggered Flow,50 Scheduled Flow, or Subflow.514. **Trigger context** — what action or event triggered the Flow? User52 action, record save, scheduled batch, or REST API call?535. **Failing node name** — the element name (if visible in the error or54 the Flow builder debug view).556. **Org type** — sandbox or production. Production errors require stricter56 redaction.577. **Recent changes** — was the Flow recently modified or deployed?58 What changed?5960In T1 mode, additionally confirm:61- Target org alias recognized by `sf org list`62- Org is sandbox (T1 mode is restricted to sandbox for live log fetch)6364---6566## Recommended Workflow6768### Step 1 — Parse the error message6970Extract from the error text:7172- **Fault type** — UNHANDLED_FAULT, NullPointerException, DML Exception,73 Governor Limit, Type Mismatch, Recursive Flow74- **Failing element** — the element name or API action mentioned75- **Variable state context** — any variable values or record ID fragments76 in the error (mask immediately per redaction rules)77- **Stack trace** — if present, extract the top frame7879Apply redaction (see Redaction Rules) before continuing analysis.8081### Step 2 (T1 mode only) — Fetch Flow metadata8283```bash84sf org list metadata \85 --metadata-type Flow \86 --target-org <alias>87```8889Filter for the failing Flow by API name. Use the result to confirm the90Flow version deployed and retrieve the element count.9192### Step 3 (T1 mode only) — Query FlowInterviewLog9394```bash95sf data query \96 --query "SELECT Id, FlowApiName, InterviewLabel, CurrentElement, ErrorCode, ErrorMessage, StartTime, EndTime FROM FlowInterviewLog WHERE FlowApiName = '<FlowApiName>' AND Status = 'Fault' ORDER BY StartTime DESC LIMIT 10" \97 --target-org <alias> \98 --result-format json99```100101Redact all record IDs and variable values before analysis.102Note: `FlowInterviewLog` and `FlowInterviewLogEntry` are available103in orgs with Flow Interview Logging enabled (must be activated in Setup →104Process Automation Settings).105106### Step 4 — Classify the root cause107108Map the parsed error to a root cause pattern109(see `references/flow-error-patterns.md`):110111| Error pattern | Root cause category |112|---|---|113| `UNHANDLED_FAULT` on Action element | Missing fault connector on the action |114| `NullPointerException` on Assignment | Variable used before being set; loop ran zero iterations |115| `DML Exception` on Update Records | Validation rule blocked the save; trigger re-entry; locked record |116| `EXCEEDED_ID_LIMIT` or `TOO_MANY_SOQL_QUERIES` | DML or SOQL inside a loop |117| `INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY` | Running user lacks object or record access |118| `FLOW_LOOP_COUNT_LIMIT` | Recursive Flow invocation; self-trigger via record update |119| `INVALID_TYPE` or `WRONG_CONTROLLER_STATE` | Merging incompatible variable types in an Assignment |120| Subflow not found | Subflow version not active or not deployed in this org |121122### Step 5 — Generate specific fix recommendation123124For each root cause, generate:1251. **Immediate fix** — what to change in the Flow builder right now1262. **Fault path recommendation** — should a fault connector be added?127 Where should the fault path go? (See `references/fault-path-design.md`)1283. **Null guard** — if null variables are involved, where should the129 null check Decision element be placed before the failing element?1304. **Data type fix** — if type mismatch, what types need to match and how131 to add an explicit conversion or intermediate variable132133### Step 6 — Emit structured diagnosis with audit envelope134135Produce the full output block per the Output Format section below.136137---138139## Quality Scoring Rubric (100-point)140141Score every diagnosis before emitting. Threshold: 80+ ship, 60–79 ship142with caveat, below 60 reject and request more context.143144| Dimension | Points | What earns full marks |145|---|---|---|146| **Root cause clarity** | 30 | Specific error type identified; failing element named; cause-and-effect chain explained in plain language |147| **Fix suggestion specificity** | 25 | Tells admin which element to click, which property to change, and what value to set — not "check the data" |148| **Fault path recommendation** | 20 | Recommends adding fault connector where missing; describes where fault path should end (screen, log, email) |149| **Data type analysis** | 15 | Identifies mismatched variable types; names correct types and where to set them |150| **Redaction quality** | 10 | All record IDs, variable values, and user IDs masked in output and audit envelope |151152**Scoring penalties:**153- Generic recommendation ("check the error") with no specific element: -25154- Missing fault path guidance when UNHANDLED_FAULT is the error type: -20155- Unredacted record ID or user ID in output: -30 (immediate caveat)156- Incorrect fault type classification: -20157158---159160## T0/T1 Contract161162### T0 Mode (default, no org connection)163164- Takes pasted error message or pasted FlowInterviewLog export as input.165- All analysis is static — no org connection.166- `allowed-tools: Read Grep Glob` only.167- No `sf` CLI commands executed.168169### T1 Mode (optional, read-only runtime)170171- Activates when user confirms org alias and explicitly requests live172 log fetch.173- OAuth scopes: `api` and `refresh_token` only.174- Run As permissions: `View Setup and Configuration`, `View Setup`.175- Denied: `ModifyAllData`, `ViewAllData`, `ViewEncryptedData`,176 `ModifyMetadata`, `AuthorApex`.177- **Restricted to sandbox orgs** — do not query FlowInterviewLog on178 production in T1 mode without explicit user confirmation and production179 safety review.180- Maximum query: 10 most recent fault records. No bulk log extraction.181182---183184## Refusal Triggers185186Stop and decline if:187188- The request is to write a new Flow from scratch (out of scope).189- The request is to deploy the fixed Flow to a production org (route to190 `salesforce-deployment-validator-skill`).191- In T1 mode: target org appears to be production and user has not192 explicitly confirmed the production safety review step.193- The audit envelope cannot be populated in T1 mode (org alias194 unresolvable, flow name missing).195- The user requests that redaction be skipped.196197---198199## Audit Envelope Schema200201Every T1 execution emits an audit envelope. T0 mode emits a reduced202envelope (no org fields).203204```yaml205audit_envelope:206 matter_id: "<caller-provided-or-generated-uuid>"207 skill_id: "salesforce-flow-debugger-skill"208 skill_version: "0.1.0"209 mode: "<T0-static | T1-live>"210 target_org_alias: "<alias or 'N/A for T0'>"211 flow_api_name: "<FlowApiName>"212 flow_type: "<RecordTriggered|Screen|AutoLaunched|Scheduled>"213 run_as_user_id: "<user_id_placeholder>"214 log_records_queried: <integer or 0 for T0>215 redactions_applied:216 - field: "<FieldOrVariableName>"217 reason: "<record_id|user_id|variable_value|pii>"218 timestamp: "<ISO-8601-UTC>"219 org_type_verified: "<sandbox | production | N/A for T0>"220```221222---223224## Output Format225226```yaml227verdict: "diagnosis-complete | needs-more-context | reject"228quality_score: <0-100>229quality_notes: "<what drove the score>"230231diagnosis:232 flow_api_name: "<FlowApiName or 'unknown'>"233 flow_type: "<type>"234 error_type: "<UNHANDLED_FAULT|NullPointerException|DML Exception|Governor Limit|Type Mismatch|Recursive|Other>"235 failing_element_name: "<ElementName or 'unknown'>"236 failing_element_type: "<Action|Decision|Assignment|Loop|GetRecords|UpdateRecords|Screen|Subflow>"237 root_cause_summary: "<1-2 sentence plain-language explanation>"238 root_cause_detail: "<technical detail with element names and variable context>"239240fix_recommendation:241 immediate_fix: "<specific steps in Flow Builder>"242 fault_path_required: <true|false>243 fault_path_design: "<where to add it and where it should terminate>"244 null_guard_required: <true|false>245 null_guard_placement: "<before which element and what Decision logic>"246 data_type_fix: "<if type mismatch: what types, where to add intermediate variable>"247 governor_limit_fix: "<if governor limit: what to move outside the loop>"248249fault_path_template:250 trigger: "<which element needs the fault connector>"251 fault_variable_capture: "<Fault Message variable assignment>"252 fault_path_ends_at: "<Screen|Custom Notification|Log to Custom Object|Email>"253 sample_fault_message_variable: "{!$Flow.FaultMessage}"254255redaction_log:256 - "<description of what was masked>"257258audit_envelope:259 <see Audit Envelope Schema>260261escalation_triggers_fired:262 - "<trigger name or 'none'>"263264missing_evidence:265 - "<what additional context would improve the diagnosis>"266267assumptions:268 - "<explicit list of assumptions made>"269```270271---272273## Redaction Rules274275Apply in order. Do not bypass for any reason.2762771. **Salesforce Record IDs (15/18-char):** Replace with278 `<record_id_placeholder>` anywhere they appear in error messages or279 log entries.2802. **User IDs (OwnerId, CreatedById, RunningUserId in logs):** Replace281 with `<user_id_placeholder>`.2823. **Flow variable values** that may contain PII (email, phone, name,283 address): Replace with `<variable_value_redacted>`.2844. **Org IDs (18-char starting `00D`):** Replace with285 `<org_id_placeholder>`.2865. **OAuth tokens, session IDs:** Strip entirely — never include in output.2876. **Instance URLs:** Replace with `<org_instance_placeholder>`.2887. **Stack trace class paths containing customer namespace:** Preserve289 class names but redact any embedded record IDs or data values.290291Document each redaction in `redaction_log`.292293---294295## Handoff Rules296297| Situation | Hand off to |298|---|---|299| Fix requires Apex action code change | `salesforce-apex-log-analyzer-skill` |300| Fix requires Flow deployment to new org | `salesforce-deployment-validator-skill` |301| Flow passes but underlying permission is wrong | `salesforce-permission-model-review-skill` |302| Static quality review of the Flow design | `salesforce-flow-automation-review-skill` |303| Flow governs a business-critical process needing production change | `salesforce-live-guard-agent` |304305---306307## Stop Conditions308309- Target org is production and T1 mode was requested without explicit310 production safety acknowledgment — stop and require acknowledgment.311- FlowInterviewLog object is not queryable (Flow Interview Logging not312 enabled in org) — stop T1 fetch, fall back to T0 mode with error message.313- Error message contains no element name and no variable context — request314 additional pasted context (full error text, Flow debug log) before315 proceeding.316- User requests to run a DML fix directly in T1 mode — refuse; route to317 human-approval path via `salesforce-live-guard-agent`.318319---320321## Security Notes322323- **T1 read-only operational:** Queries `FlowInterviewLog` only. No DML,324 no metadata mutation, no Apex execution.325- **Sanitized output only:** All record IDs, user IDs, and variable values326 redacted before emission.327- **Sandbox-preferred for T1:** Production FlowInterviewLog access requires328 explicit user confirmation and applies stricter redaction.329- **Structured audit emitted:** Every T1 execution produces a complete audit330 envelope.331- **Least-privilege Run As account:** No Modify All Data, View All Data,332 View Encrypted Data, or Modify Metadata.333334---335336## Reference File Index337338| File | When to read |339|---|---|340| `references/flow-error-patterns.md` | Common Flow errors and their root causes |341| `references/fault-path-design.md` | When and how to add fault connectors |342| `references/interview-log-redaction.md` | Sanitizing FlowInterviewLog output |