Team → Seam → Journey
63 workflows so UAT doesn't eat you
From chain testing grew a full System Integration Testing program: 63 workflows in three phases - 15 team-boundary, 6 cross-team seams, 42 compound end-to-end paths. Without gate order, UAT becomes a morale sink: infinite retest, no owner, activity without landing.
Here's what this piece covers: the quiet-UAT anti-pattern, the three phases, how we sequenced proof in TEST, and three program policies I would publish as a lead.
Portfolio note: we measured 35% defect reduction as recurrence slowed at 94 named handoffs - team-estimated; verify baseline before you cite it in your org.
Part of Field Notes: agentic delivery.
1. The leadership problem
Parallel team CI without seam gates produces green locally, red in integrated TEST. Teams argue whose environment is ready while users still see one broken moment.
Wrong: "We ran SIT for six weeks."
Right: "63 workflows in three phases: prove team scope, prove seams, prove the end-to-end path - with explicit exit criteria between each."
The anti-pattern is quiet UAT death - retest loops with no owner, activity without landing the plane.
2. What the corpus shows
The SIT plan matured May–Jun 2026 across docs/SIT Plan/ - no single hero commit, but a coherent portfolio narrative in sit-program-portfolio-summary.md.
| Phase | Count | Question it answers |
|---|---|---|
| Phase 1 | 15 | Does our service work? (identity, records, org-data team boundaries) |
| Phase 2 | 6 | Does the seam work? (shared coordinators) |
| Phase 3 | 42 | Does the user get the result? (UJ-* paths) |
Plain rule from the overview doc:
- Phase 1 = our service works
- Phase 2 = the handoff works
- Phase 3 = the user gets the outcome
Gate policy as something you can code-review:
enum SitPhase { TEAM, SEAM, JOURNEY }
boolean mayEnter(SitPhase next, Map<SitPhase, Boolean> green) {
return switch (next) {
case TEAM -> true;
case SEAM -> Boolean.TRUE.equals(green.get(SitPhase.TEAM));
case JOURNEY -> Boolean.TRUE.equals(green.get(SitPhase.SEAM));
};
}Gate rules (verified in plan docs):
- Phase 2 in TEST requires all three Phase 1 team gates green
- Phase 3 requires all Phase 2 workflows green
- UAT replays promoted suites - same workflow IDs, different base URL
3. How it works
Phase 1 examples: record CRUD inside a team boundary; entitlement service self-tests with mocked peers.
Phase 2 examples: WF-ACCT-1 signup ↔ records service; WF-REG-1/2 entitlement from upstream record; partner/locator shared paths.
Phase 3: compound UJ-* paths grouped by user outcome - API read-back, not browser (browser proof is tiers beat the full matrix).
| Team | Phase 1 role | Blocks |
|---|---|---|
| Identity / shared | Shared platform services | Phase 2 until team Phase 1 green |
| Records | Primary action path | Phase 2 until team Phase 1 green |
| Org / partner data | Org + locator data | Phase 2 until team Phase 1 green |
What broke: Phase 2 blocked for weeks when one team deferred "not our service." Workflow IDs must map to Jira - or traceability dies in triage.
4. Named pattern: team → seam → journey
Team → seam → journey - three SIT phases with explicit exit criteria; 63 workflows sequenced, not dumped into UAT.
Count seams explicitly. We tracked 94 handoffs - optimize test design for seams, not endpoint count.
5. What I'd do as a lead
- Publish phase gates as program policy, not team preference. "Optional SIT" is how UAT dies quietly.
- One shared pipeline promotes suites TEST → UAT - same IDs, different env. Forked suites fork truth.
- Name seam owners on the integration surface map (article 02). Feature owners alone cannot sign Phase 2.
Further reading
- Prove the path, not the POST
- Tiers beat the full matrix - browser layer, same paths
- Planning:
docs/sit-program-portfolio-summary.md,docs/SIT Plan/00-sit-plan-overview.md