Phase 2 integration tests verify that agents hand off correctly to one another and that the full automated flow from Google Forms submission to Slack proposer notification operates as a connected chain. All tests continue the sequential ID numbering from Phase 1.
ID
Scenario
Input
Expected Output
Pass Criteria
T14
Full handoff: Intake Validation Agent passes valid payload to Scoping and Routing Agent
Complete Google Forms sandbox submission with all fields valid
Intake Validation Agent marks submission as complete; Scoping and Routing Agent receives the validated payload automatically and creates Notion page, Sheets row, and Slack notification without manual intervention
Scoping and Routing Agent execution log shows trigger source as 'Intake Validation Agent — validated'; all three outputs verified; end-to-end latency under 15 seconds
T15
Reviewer submits assessment form; Notion record updates automatically
Sandbox reviewer submits Google Form assessment with recommendation 'Approve' and completeness score 4/5
Notion page status field updated to 'Awaiting Leadership Decision'; reviewer name, recommendation, and score written to Notion properties; Google Sheets row status updated to match
Notion property values match form submission values exactly; Sheets status column reads 'Awaiting Leadership Decision'; update completes within 20 seconds of form submission
T16
Approval Digest Agent correctly reads Sheets rows created by Scoping and Routing Agent
Two sandbox Sheets rows written by T14 flow, both in 'Awaiting Leadership Decision' status
Digest Agent reads both rows, compiles a single Gmail digest listing both initiatives with their budgets and reviewer recommendations
Gmail body contains exactly two initiative entries; budget totals are arithmetically correct; both Notion links are valid sandbox URLs
T17
Final decision recorded in Notion triggers Sheets update and proposer Slack notification
Sandbox founder records 'Approved' decision in Notion status field
Google Sheets tracker row status updated to 'Approved'; Slack message sent to sandbox proposer channel with decision outcome and any conditions noted
Sheets status column reads 'Approved'; Slack message delivered to correct sandbox channel; message body includes decision outcome and reference ID
T18
Reviewer 'Decline' recommendation flows correctly through to digest and proposer notification
Sandbox reviewer submits assessment with recommendation 'Decline'
Notion status updates to 'Awaiting Leadership Decision'; digest includes the initiative flagged as 'Reviewer Recommendation: Decline'; after leadership confirms decline, proposer receives Slack message with decline outcome
All status values propagate correctly; digest label matches recommendation; proposer Slack message uses decline-specific message template
T19
Two simultaneous form submissions processed without collision
Two Google Forms sandbox submissions fired within 2 seconds of each other, different proposers, different categories
Both submissions processed independently; two separate Notion pages with unique reference IDs; two separate Sheets rows; two separate Slack notifications to appropriate reviewer channels
Reference IDs are distinct; Notion pages are distinct documents; Sheets contains exactly two new rows; no field data from one submission appears in the other's record
T20
Reviewer deadline calculation correct across a weekend boundary
Submission received at 4:30 PM on a Thursday sandbox test date
Review deadline calculated as 3 business days later: Tuesday of the following week; deadline date appears correctly in Slack notification and Notion page
Deadline date in Slack message and Notion property matches the expected Tuesday date; Saturday and Sunday not counted in the calculation
T21
Approval Digest Agent correctly skips initiatives with 'Decline' recommendation already actioned
Sheets row with status 'Declined' already recorded
Digest Agent excludes the declined row from the digest; only rows in 'Awaiting Leadership Decision' status included
Digest email does not reference the declined initiative; log confirms the row was evaluated and excluded by status filter
Edge case tests — the following cases use the E01 numbering series and cover failure modes, data anomalies, and human timeout scenarios that fall outside the standard flow.
ID
Scenario
Input
Expected Output
Pass Criteria
E01
Duplicate submission: same proposer submits identical initiative within 10 minutes
Two Google Forms payloads with identical proposer email, initiative title, and summary text submitted within 10 minutes
Agent detects duplicate based on proposer email plus initiative title hash; second submission is held; proposer receives a Slack message noting a submission with the same title is already in the queue
Only one Notion page and one Sheets row created; duplicate detection log entry recorded; proposer Slack message delivered referencing the existing reference ID
E02
Submission with all fields populated but effort field set to zero
Google Forms payload with estimated effort hours field containing value 0
Agent treats zero effort as an incomplete response; sends Slack follow-up to proposer requesting a realistic effort estimate greater than zero
Slack message delivered specifying the effort field; no Notion record created; log records the zero-value rejection reason
E03
Notion API completely unavailable for more than 90 seconds
Valid validated payload; Notion API mock returns HTTP 503 for all calls over a 90-second window
Agent exhausts retry budget (3 attempts with exponential backoff); logs a critical error; sends a Slack alert to the FullSpec internal monitoring channel; Sheets row is still written with Notion URL marked as 'pending — creation failed'
Critical error log entry present; Slack monitoring alert delivered to designated channel; Sheets row exists with status 'Pending — Notion Unavailable'; no silent failure
E04
Reviewer does not submit assessment within the 3-business-day deadline
Sheets row with reviewer deadline date now in the past; no reviewer assessment received
Agent sends an automated reminder Slack message to the assigned reviewer; if a further 24 hours pass with no response, a second Slack message is sent to the fallback reviewer and the Sheets row status is updated to 'Review Overdue'
First reminder delivered at deadline; second escalation delivered 24 hours later to fallback reviewer; Sheets status reads 'Review Overdue'; log records both reminder events with timestamps
E05
Slack API unavailable when reviewer notification is attempted
Valid Scoping and Routing Agent run; Slack API mock returns HTTP 503 on notification send
Agent retries Slack send twice with 15-second backoff; if all retries fail, logs the failure and sends an email to the reviewer via Gmail as a fallback notification channel
Gmail fallback sent to reviewer's email address extracted from the routing table; Slack failure logged with retry count; Notion and Sheets records still complete
E06
Google Sheets tracker contains a row with a corrupted status value not matching any known status enum
Sheets row with status field containing 'UNKNOWN_STATUS' picked up by Approval Digest Agent
Agent skips the corrupted row; logs a data integrity warning with the row reference ID; digest sent for all other valid rows; no crash or silent exclusion
Digest delivered without the corrupted row; data integrity log entry includes row reference ID and the unexpected status value found; agent execution completes normally
E07
Leadership records a decision in Notion but Google Sheets API is unavailable at the moment the status update is attempted
Notion decision webhook fires; Sheets API mock returns HTTP 503
Agent logs the Sheets write failure; queues a retry for 5 minutes; sends a Slack message to the Operations Manager noting that the Sheets tracker update failed and will be retried
Retry log entry present; Slack notification delivered to Operations Manager sandbox channel; Sheets row updated correctly on retry within 5 minutes; no duplicate row created