Skip to content

Red-to-green demo

One bug, the whole loop, no credentials

Every panel below is generated by the real StepStitch service modules — the same scrubber, scorer, compiler, draft adapters, and verdict logic the live product runs. There is no database and no ServiceNow/Salesforce/GitHub/cloud credential anywhere. Drafts and the pull request are dry-run previews; nothing is ever sent.

Demo data · dry-run — nothing sent
  1. 1. User reports a bug
  2. 2. StepStitch captures structural footsteps only
  3. 3. The server scrubber proves no NPI persisted
  4. 4. A replayability score tells engineering if the bug is reproducible
  5. 5. StepStitch generates a Playwright repro
  6. 6. A ticket/PR draft is created (dry-run — never sent)
  7. 7. CI reports pre-fix failed and post-fix passed
  8. 8. StepStitch records confirmed_fixed in the regression corpus
1

User reports a bug

User-reported issue: HTTP 500 on /accounts/:id/transfer

Forbidden fields the SDK sent (placeholders only)

metadata.headersmetadata.raw_urlfootsteps[5].metadata.cookiesfootsteps[5].metadata.request_bodyfootsteps[5].metadata.url

Synthetic placeholders ONLY (no real NPI). Present to demonstrate the scrubber dropping forbidden fields and redacting PII-shaped text.

2

Structural footsteps only

  1. Visited route

    /accounts/:id

  2. Visited route

    /accounts/:id/transfer

  3. Interaction

    [data-testid=payee-select]

  4. Interaction

    [data-testid=amount-input]

  5. Interaction

    [data-testid=review-transfer]

  6. API error

    /accounts/:id/transfer

3

The server scrubber proves no NPI persisted

Scrub status: scrubbed

Fields dropped or redacted before storage

explanationfootsteps[0].routefootsteps[1].routefootsteps[5].metadata.endpointfootsteps[5].metadata.cookiesfootsteps[5].metadata.request_bodyfootsteps[5].metadata.urlmetadata.headersmetadata.raw_url

explanation → Transfer to account [redacted:number] failed; reach me at [redacted:email] or [redacted:ssn].

Never captured

  • Screenshots / video
  • Input values (what a user typed)
  • Page text / DOM content
  • Raw URLs (templated to routes)
  • Request / response bodies
  • Raw frontend logs / console messages / stack traces
  • Network headers / cookies
  • SSNs, account/card numbers, emails, phone numbers (redacted from free text)
4

Replayability score

0.76grade B

6

steps

3

interactive

3

stable selectors

  • templated_route_needs_fixture
  • templated_route_needs_fixture
  • templated_route_needs_fixture
  • templated_route_needs_fixture
  • templated_route_needs_fixture
  • templated_route_needs_fixture
5

Generated Playwright repro

import { test, expect } from '@playwright/test';

// StepStitch autogenerated reproduction (trace: trc_demo_red_to_green_0001)
// Replayability: 0.76 (grade B)
//   ⚠ templated_route_needs_fixture [step 0]: Route '/accounts/:id' is templated; supply a concrete fixture id.
//   ⚠ templated_route_needs_fixture [step 1]: Route '/accounts/:id/transfer' is templated; supply a concrete fixture id.
//   ⚠ templated_route_needs_fixture [step 2]: Route '/accounts/:id/transfer' is templated; supply a concrete fixture id.
//   ⚠ templated_route_needs_fixture [step 3]: Route '/accounts/:id/transfer' is templated; supply a concrete fixture id.
//   ⚠ templated_route_needs_fixture [step 4]: Route '/accounts/:id/transfer' is templated; supply a concrete fixture id.
//   ⚠ templated_route_needs_fixture [step 5]: Route '/accounts/:id/transfer' is templated; supply a concrete fixture id.
// NOTE: no credentials are embedded. Wire authentication to a synthetic
// test account before running against a protected route.
test('StepStitch reproduction', async ({ page }) => {
  // TODO: authenticate as a synthetic test user if the flow requires it.

  // [NAVIGATION] /accounts/:id
  // TODO: substitute id(s) in templated route '/accounts/:id'
  await page.goto('http://localhost:3000/accounts/:id');

  // [NAVIGATION] /accounts/:id/transfer
  // TODO: substitute id(s) in templated route '/accounts/:id/transfer'
  await page.goto('http://localhost:3000/accounts/:id/transfer');

  // [CLICK] /accounts/:id/transfer
  await page.locator('[data-testid=payee-select]').click();

  // [CLICK] /accounts/:id/transfer
  await page.locator('[data-testid=amount-input]').click();

  // [CLICK] /accounts/:id/transfer
  const response0 = page.waitForResponse(
    (r) => r.url().includes('/api/accounts/') && r.request().method() === 'POST',
  );
  await page.locator('[data-testid=review-transfer]').click();
  // expected API failure: /api/accounts/:id/transfers (HTTP 500)
  const res0 = await response0;
  expect(res0.status(), 'no server error from /api/accounts/:id/transfers').toBeLessThan(500);

});

Red while broken, green once fixed.

6

Ticket & PR drafts — created, never sent

dry-run — nothing sent

servicenow

8 flat fields · correlation id linked

salesforce

10 flat fields · correlation id linked

genesys

13 flat fields · correlation id linked

GitHub

issue + dry-run PR on stepstitch/trace-trc_demo_red_to_green_0001

dry-run: StepStitch never merges — a human reviews and merges.

7

CI reports red, then green

Pre-fix run (bug present)failed
Post-fix run (after the fix)passed
verdict: confirmed_fixed

confirmed_fixed derives only from pre_passed=false + post_passed=true.

8

Recorded in the regression corpus

1 confirmed-fixed entry

The fix is now durable regression evidence: if this bug ever returns, the committed Playwright test goes red again. That is the moat — a recording cannot do this.