Team → Seam → Journey

63 workflows so UAT doesn't eat you

Share

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
flowchart TD P1[Phase 1 - 15 team workflows] --> P2[Phase 2 - 6 seam workflows] P2 --> P3[Phase 3 - 42 end-to-end paths] P3 --> UAT[UAT replay - same IDs] P1 -.->|all three teams green| P2 P2 -.->|all seams green| P3

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

  1. Publish phase gates as program policy, not team preference. "Optional SIT" is how UAT dies quietly.
  2. One shared pipeline promotes suites TEST → UAT - same IDs, different env. Forked suites fork truth.
  3. Name seam owners on the integration surface map (article 02). Feature owners alone cannot sign Phase 2.

Further reading