Screen Play

증거 기반 자동화 엔진

에이전트가 "됐다"고 할 때, 진짜 됐는지 증명합니다.

AI 주장·막힌 사이트·반복 워크플로우를 실제 브라우저에서 다시 돌리고, 스크린샷·트레이스·SHA-256 해시로 증거를 남깁니다. 거짓 양성 한 건이 결제·법무 리스크가 되기 전에 잡아냅니다.

ScreenPlay proof dashboard concept

실측 근거 · 리스트 추출

실제 운영 사이트 50곳에서 목록 데이터(채용·가격·글)를 정확도 92%로 추출 — AI 호출 0회, 행당 $0, 매 실행 결과 동일.

측정 결과 전체 보기 →

검증된 유스케이스 · 커밋된 실행 스크립트

웹 스크래핑·AI 판단·셀프힐링·플래닝·자영업/마케터 워크플로까지 — 실제로 돌아가는 유스케이스 162개를 22개 카테고리로 정리했습니다. 각 항목마다 커밋된 실행 스크립트 파일명을 함께 표시합니다.

유스케이스 전체 보기 →

라이브 검증 현황

184실사용 자동화 시나리오 (UC 매트릭스)
164UC 매트릭스 통과 (✅)
134실제 Chrome으로 라이브 검증
SHA-256모든 실행에 변조 불가 증거 해시

공개 데이터 + 본인 인가 세션만 사용 — anti-abuse 우회 없음. 막히면 정직하게 멈춥니다.

당신의 루프 어디에 들어가나

에이전트는 "됐다"고 보고합니다. ScreenPlay는 그 사이에서 증거로 확인합니다.

AI 코딩 에이전트·테스트 하니스의 루프에서 가장 약한 고리는 "정말 됐나?"입니다. ScreenPlay는 그 검증 단계 하나로 들어갑니다 — 에이전트의 자기보고를 실제 실행 + 증거로 바꿔, 다음 단계로 넘어갈 근거를 만듭니다.

  1. 01에이전트가 작업코드 작성 · 브라우저/데스크톱 액션
  2. 02"완료" 자기보고근거 없음 — 진짜 됐는지 알 수 없음
  3. 03ScreenPlay 검증실제로 다시 실행 → 스크린샷 · 트레이스 · 판정
  4. 04검증된 결과통과 → 다음 단계 / 실패 → 에이전트로 피드백

↻ 실패는 다시 1번으로 — 사람이 매 단계 들여다보지 않아도 루프가 스스로 정직해집니다.

하니스를 만드는 개발자라면: 이 검증 단계를 CLI 한 줄(screenplay run --browser verify.play)이나 Python 바인딩으로 끼워 넣으세요. 통과/실패 + 증거 번들이 그대로 돌아옵니다.

이게 당신 얘기인가요?

개발자 넷, 같은 고통 — "진짜 됐는지"를 모른다.

어느 쪽이든 ScreenPlay의 답은 같습니다. 됐다고 말하는 대신, 증거로.

AI로 일하는 개발자

에이전트 자기보고를 못 믿겠다

이런 상황
Claude Code·Cursor·Codex가 "체크아웃 완료"·"테스트 통과"·"배포 됨"이라고 보고. 확인하려면 결국 사람이 매번 직접 띄워 봐야 함. 거짓 양성 한 건이 결제·법무 사고.
ScreenPlay의 답
그 작업을 실제 브라우저·데스크톱에서 다시 돌려 스크린샷·트레이스·판정으로 답합니다. 에이전트가 거짓말하면 자동으로 드러납니다 — 루프에 검증 레이어가 생깁니다.
어떻게
에이전트 루프에 검증 단계로 삽입 → 통과/실패 + 증거 번들

하니스를 만드는 개발자

내 에이전트 하니스에 검증이 빠져 있다

이런 상황
자체 에이전트·자동화 하니스를 만드는데 "행동이 실제로 먹혔나"를 확인하는 단계가 약함. 매 스텝 사람이 눈으로 보거나, 깨지기 쉬운 커스텀 체크를 직접 짜야 함.
ScreenPlay의 답
검증 단계를 CLI 한 줄 또는 Python 바인딩으로 끼워 넣으세요. 실제 실행 + 표준 증거 번들(스크린샷·트레이스·판정)이 돌아와, 하니스가 다음 스텝을 신뢰할 근거를 갖습니다.
어떻게
screenplay run --browser verify.play → 판정 + 증거를 그대로 파싱

스크래핑이 일인 담당자

셀렉터가 매주 깨지고, 사이트가 막는다

이런 상황
가격·리서치·운영 데이터를 긁는데 셀렉터는 리디자인마다 깨지고, anti-bot은 평범한 자동화를 차단. 깨지기 쉬운 스크립트 더미를 매주 손봐야 함.
ScreenPlay의 답
AI Vision이 "같은 의도"의 요소를 자동 재발견(self-healing). 막히면 정직하게 fail-closed로 멈추고 이유를 남깁니다 — 빈 데이터를 데이터인 척하지 않습니다. 다음 주에도 살아있습니다.
어떻게
self-heal 셀렉터 + wall_check 감지·정지 + 증거 캡처

초보 개발자

브라우저 자동화 진입장벽이 높다

이런 상황
스크래핑·폼 입력·플로우 테스트 하나 하려고 Playwright/Selenium의 async·셀렉터·anti-bot 보일러플레이트를 다 배워야 함. 배보다 배꼽이 큼.
ScreenPlay의 답
읽기 쉬운 .play 언어로 10줄이면 됩니다. self-healing·증거 캡처·fail-closed가 엔진에 내장이라, 브라우저 자동화 전문가가 되지 않아도 자동화가 됩니다.
어떻게
page.goto → discover_list({name, price}) → capture_evidence — 끝

기술 디테일 → /technology

코드 비교

Playwright 40줄이 하던 일을, .play 10줄로.

self-healing 셀렉터·증거 캡처·fail-closed 처리가 엔진에 내장이라 매주 깨지던 보일러플레이트가 사라집니다.

기존 — Python + Playwright

import asyncio, json, hashlib
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        ctx = await browser.new_context(viewport={"width": 1280, "height": 800})
        page = await ctx.new_page()
        try:
            await page.goto(URL, wait_until="networkidle", timeout=30000)
        except Exception:
            await browser.close()
            raise SystemExit("navigation failed")
        # selector breaks on every redesign — constant upkeep
        cells = await page.query_selector_all("div.product-card span.price")
        prices = [(await c.inner_text()).strip() for c in cells]
        if not prices:               # blocked? selector changed? can't tell
            await browser.close()
            raise SystemExit("blocked or selector changed")
        await page.screenshot(path="out.png", full_page=True)
        with open("out.json", "w") as f:
            json.dump({"prices": prices, "url": page.url}, f, ensure_ascii=False)
        sha = hashlib.sha256(open("out.png", "rb").read()).hexdigest()
        print("evidence", sha[:8])
        await browser.close()

asyncio.run(main())

ScreenPlay — .play

try:
    page.goto(url)
recover NetworkError:
    retry(max=3, backoff_ms=500)

if page.wall_check():
    stop_before("blocked")        # honest fail-closed, stops here

# self-healing selectors survive redesigns
items = page.discover_list({name, price})

capture_evidence("prices")        # screenshot + SHA-256 manifest
fs.write_json("out.json", items)

두 코드는 같은 일을 합니다: 가격 추출 → 스크린샷+해시 증거 → 막히면 정직하게 종료. 차이는 유지보수 비용입니다.

주장에서 증명까지

에이전트는 체크아웃 완료라고 합니다. ScreenPlay가 워크플로우를 실제로 돌립니다.

주장

"Checkout flow completed on example storefront"

모드
Automation claim proof
상태
completed
판정
needs review

준비 마커가 없으면 엔진은 통과로 찍지 않고 needs_review로 표시합니다. 양방향으로 거짓말하지 않는 것이 핵심입니다.

증명 번들

  • Bundle: bun_example_checkout
  • Screenshot: checkout-final.png
  • SHA-256: b7f783ba...ce8f
  • Timing: 590ms total
  • Trace: assert_visible Order confirmed

Fail-closed 샘플

준비 마커가 없으면 기계 판독 가능한 실패가 반환됩니다.

POLICY_DENIED

깨져도 · 막혀도 가는 스크래핑

셀렉터가 깨지고 사이트가 막아도, 다음 주에도 돌아갑니다.

ScreenPlay 스크래핑은 세 가지로 버팁니다. (1) AI Vision self-healing — 셀렉터가 깨지면 "같은 의도"의 요소를 다시 찾습니다. (2) 정직한 fail-closed — 막히면 빈 데이터를 데이터인 척하지 않고 이유와 함께 멈춥니다. (3) 증거 — 매 실행이 스크린샷·트레이스로 남아 무엇을 긁었는지 검증됩니다.

이것까지 견딥니다

  • 사이트 리디자인
  • 셀렉터 변경
  • anti-bot 차단
  • 무한 스크롤
  • 페이지네이션
  • 로그인 게이트

정직성 경계: 공개 데이터 + 본인 인가 세션만 다룹니다. anti-abuse 컨트롤(CAPTCHA·로그인 벽)은 우회하지 않고 감지해서 멈춥니다 — 그래서 "긁었다"는 결과를 믿을 수 있습니다.

장난감이 아닙니다

실제 SaaS가 이 엔진 위에서 돌아갑니다.

식당 POS 제품 WinClaw가 ScreenPlay 엔진 위에서 운영됩니다. 그리고 이 프로젝트 자체가 도그푸딩 — Claude Code의 spec 작업이 ScreenPlay 증거로 검증되며 개발됩니다. 데모용 토이가 아니라 프로덕션에서 쓰이는 엔진입니다.

WinClaw 보러 가기 →

함께 만들기

팀에, 제품에 ScreenPlay를 얹어 보세요.

도입·라이선스·협업 — 어떤 형태든 먼저 한 줄 보내주세요. 검토 후 사람이 직접 회신드립니다. 맞으면 같이, 아니어도 솔직하게.