diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..6c9fe43
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1 @@
+site/.vercel/
diff --git a/README.md b/README.md
index 9ef21b8..e39e16e 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,8 @@ The Build Week reference flow records a browser bug, captures the expected outco
The agent-operated reference flow is limited to local HTTP and HTTPS development servers. TaskTape creates a headed isolated Chrome session and exposes 12 bounded MCP tools for observation, interaction, evidence capture, check creation, and explicit execution. Finishing a capture never runs or schedules the check.
+Agent-created checks keep their evidence attached. Users can inspect screenshot, console, network, and trace counts, copy a ticket-ready Markdown report, reveal the local files, or export the observed steps as an ordinary Playwright TypeScript test. Exported tests use no LLM at run time and remain reviewable before they enter source control or CI.
+
Checks have editable instructions and can run now or on hourly, daily, weekday, or weekly timing. Manual and scheduled results appear in Run history, so a team can see when a previously fixed behavior regresses.
A spoken schedule such as "every Monday at 9 AM" prefills the save controls. It never becomes active until the user confirms unattended execution and saves the task. The Scheduled view shows the next run, last result, pause or resume, and Run now controls.
@@ -56,6 +58,7 @@ Ask the connected agent to reproduce a bug on a local development URL and turn i
- [Architecture](docs/architecture.md)
- [Agent-operated replay milestone](docs/agent-mcp-milestone.md)
- [Voice and scheduling research](docs/voice-and-scheduling-research.md)
+- [Reddit competitor research](docs/reddit-market-research.md)
- [Market validation](docs/market-validation.md)
- [Milestone roadmap](docs/roadmap.md)
- [Verification log](docs/verification.md)
diff --git a/docs/architecture.md b/docs/architecture.md
index c7194f9..ab9e53d 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -31,6 +31,10 @@ The first MCP capability intentionally targets local web applications. `start_bu
Every operation stores an ordered action plus a screenshot. The session also records console messages, page errors, failed requests, HTTP error responses, initial and final screenshots, and a Playwright trace containing DOM snapshots and action timing. Finishing compiles the recorded actions into a review-required computer workflow and closes the temporary browser. Running or scheduling remains a separate explicit action.
+Agent actions also persist their schema-validated replay command. TaskTape can compile those commands into a small Playwright TypeScript test using the exact observed selectors and inputs, without calling a model during later test runs. The export carries the expected outcome as review context and uses a visual assertion that requires the developer to approve a baseline. Older sessions remain readable but cannot be exported from their natural-language summaries.
+
+The same session can produce a Markdown bug report with reproduction steps and diagnostic context. Reports are copied through the main process, exports use a native save dialog and `0600` file mode, and revealing evidence opens the existing local session directory. The renderer receives only evidence counts and availability flags.
+
## Capture source selection
TaskTape lists full displays and open application windows through Electron `desktopCapturer`, then renders a grouped thumbnail gallery in the sandboxed UI. A source ID selected by the user is validated against a freshly enumerated main-process source list. The display-media handler consumes that one pending selection and rejects requests without one; the renderer cannot nominate an arbitrary capture target.
diff --git a/docs/hackathon-strategy.md b/docs/hackathon-strategy.md
index b29c41d..b3e59fa 100644
--- a/docs/hackathon-strategy.md
+++ b/docs/hackathon-strategy.md
@@ -347,7 +347,7 @@ The README must then show: what changed during Build Week, exact GPT-5.6 integra
9. **Can it test any application?** No. The hackathon proves one complete browser workflow and a bounded macOS execution path.
10. **What happens when the UI changes?** GPT-5.6 reasons over the current screen instead of replaying fixed coordinates, but major changes can still fail and are reported.
11. **Does it capture passwords?** Agent sessions reject password-field fills, accept only local development URLs, and remain local. API keys use operating-system encryption. Human recordings still require the user to avoid exposing secrets.
-12. **Why not generate Playwright?** TaskTape already uses Playwright for rich capture, but GPT-5.6 replay adapts to the current visual interface and can later extend beyond DOM-only targets. Exportable Playwright tests are future work.
+12. **Does TaskTape generate Playwright?** Agent-recorded browser sessions can export their observed steps as ordinary Playwright TypeScript with a reviewed visual baseline. TaskTape also keeps GPT-5.6 replay for adaptive checks and targets beyond DOM-only browser flows.
13. **Does scheduling run while the Mac sleeps?** No. The app must be open and the Mac awake.
14. **What happens on a model safety check?** The run stops before the flagged action executes.
15. **What did Codex build?** The repo documents the iterative native recorder, schemas, execution adapters, scheduler, tests, and design revisions in dated commits.
@@ -355,7 +355,7 @@ The README must then show: what changed during Build Week, exact GPT-5.6 integra
17. **What is mocked?** Automated Electron tests mock model responses. The separate live tests use the real OpenAI API and are labeled.
18. **How reliable is it?** All 61 unit and integration tests and 10 Electron journeys pass. The visual evaluator classified five consecutive broken and fixed pairs correctly, and the paired live replay produced the expected fail and pass results.
19. **What is the business wedge?** Product and support teams that collect bug videos but lack time to convert every issue into regression coverage.
-20. **What comes next?** Exportable test artifacts, CI triggers, richer event traces, signed builds, and an open evaluation format for computer-use agents.
+20. **What comes next?** Repository-aware exports, CI triggers, reviewed repair suggestions, signed builds, and an open evaluation format for computer-use agents.
## Red-team conclusion
diff --git a/docs/reddit-market-research.md b/docs/reddit-market-research.md
new file mode 100644
index 0000000..2d5b93d
--- /dev/null
+++ b/docs/reddit-market-research.md
@@ -0,0 +1,74 @@
+# Reddit market research
+
+Research date: 2026-07-20
+
+## Question
+
+Which competitor features are useful in real QA work, and which gaps should TaskTape close without becoming another generic recorder or opaque AI testing service?
+
+This is qualitative research, not market sizing. Reddit comments are anecdotal and can include vendor promotion. Claims were checked against current product documentation where possible.
+
+## What practitioners keep saying
+
+- Ground automation in a browser flow that a person or agent actually observed. Several practitioners report better results when AI converts a verified Playwright recording into code instead of inventing tests from source code alone.
+- Keep a human in the loop. Reviewable code, explicit expected outcomes, and key-step screenshots matter more than an agent claiming success.
+- Capture debugging context with the report. Console messages, failed requests, screenshots, and exact reproduction steps reduce the developer's work after a bug is filed.
+- Do not require an LLM every time a regression runs. Teams call out cost, latency, noisy MCP sessions, weak selectors, and confidently incorrect assertions.
+- Let the team own the artifact. Ordinary Playwright files fit source control, code review, CI, and existing test conventions better than a closed test format.
+
+## Competitor comparison
+
+| Product or approach | What appears to work | Repeated weakness or risk | TaskTape before this milestone |
+| ------------------------------------ | -------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
+| Jam | One capture includes video, reproduction context, console and network evidence, then moves into issue trackers | Strong at reporting, but it is not the same as a durable regression test owned in the repository | TaskTape stored richer local evidence but did not turn it into a ticket-ready report |
+| Playwright recorder and MCP | Real browser execution, familiar code, screenshots, traces, and CI compatibility | Generated tests still need review; users report weak locators, missing assertions, token use, and very large generated files | TaskTape captured observed actions but kept them inside its session format |
+| BugBug and record-and-replay tools | Fast recording, screenshots for each step, reports, and low-code editing | Recorder output can be brittle, and a recording without a meaningful assertion is not a regression check | TaskTape had an expected result and replay verdict, but no portable test export |
+| Momentic and Autify-style AI testing | Natural-language authoring, self-healing, run diagnostics, and managed execution | Closed or platform-specific formats can reduce control; AI healing still needs governance | TaskTape favored local evidence and explicit approval, but lacked a developer-owned handoff |
+| QA Wolf | Playwright ownership, managed parallel runs, CI, and human-reviewed failures | Managed service cost and external ownership are a poor fit for every small team | TaskTape runs locally but did not offer standard code that could graduate into CI |
+
+## Features selected
+
+### 1. Portable Playwright export
+
+TaskTape now stores structured commands while an agent reproduces a bug and compiles them into a small TypeScript Playwright test. The export uses role, label, text, or CSS locators captured during the observed run, supports a `TASKTAPE_BASE_URL` override, records the expected result, and ends with an explicit visual assertion.
+
+The generated test does not call an LLM. A developer reviews it once, creates the visual baseline, and can then run it in normal Playwright CI. Sessions recorded before structured command capture clearly ask the user to record again instead of guessing from prose.
+
+### 2. Ticket-ready bug report
+
+Each agent-created check can copy a Markdown report containing what happened, the expected result, exact reproduction steps, observations, console and network events, and local evidence filenames. This borrows the useful handoff shape from Jam without uploading private evidence or requiring an issue-tracker account.
+
+### 3. Visible evidence inventory
+
+Saved checks now expose action, screenshot, console, network, and trace counts. Users can reveal the local evidence folder before deciding whether to run, export, or share anything.
+
+## Not selected yet
+
+- **Automatic self-healing:** useful when a locator changes, but dangerous without showing the proposed repair and comparing it with the original intent. This needs a separate review workflow and flake classification.
+- **Direct Jira, Linear, or GitHub issue creation:** valuable, but local Markdown copy provides the handoff without adding OAuth, cloud storage, or a vendor-specific integration during this milestone.
+- **Managed cloud execution:** competitors already serve this category. TaskTape's current differentiation is local evidence, agent operation, explicit review, and portable output.
+- **Automatic codebase edits:** Reddit contains concrete reports of coding agents changing application behavior so generated tests pass. TaskTape exports a reviewable test and does not modify the target application.
+
+## Decision
+
+TaskTape should not compete as another no-code recorder. Its strongest position is the bridge from a human or coding agent reproducing a real bug to two owned artifacts: a developer-ready report and a normal regression test. The product still needs repository-aware export, direct issue handoff, CI setup, and reviewed repair suggestions before it can replace a mature team workflow.
+
+## Sources
+
+### Reddit discussions
+
+- [Are you actually using AI in test automation?](https://www.reddit.com/r/QualityAssurance/comments/1sxdmmo/are_you_actually_using_ai_in_test_automation/)
+- [Anyone actually using AI for test automation? What works?](https://www.reddit.com/r/QualityAssurance/comments/1mna861/anyone_actually_using_ai_for_test_automation_what/)
+- [Has anyone used Playwright MCP yet?](https://www.reddit.com/r/QualityAssurance/comments/1jzkqgs/has_anyone_used_playwright_mcp_yet_im_wondering/)
+- [What real-world QA use cases do you have with AI agents?](https://www.reddit.com/r/QualityAssurance/comments/1tp15zu/what_realworld_qa_use_cases_do_you_have_with_aiai/)
+- [Bug reporting tool discussion about Jam](https://www.reddit.com/r/QualityAssurance/comments/152t1kx/)
+- [Do software testers use any tools or AI for testing?](https://www.reddit.com/r/QualityAssurance/comments/1rq6d23/do_software_testers_here_use_any_tools_or_ai_for/)
+- [What is missing from this AI-driven E2E testing workflow?](https://www.reddit.com/r/Playwright/comments/1umqvix/whats_missing_from_this_aidriven_e2e_testing/)
+- [Claude wrote Playwright tests that secretly patched the app](https://www.reddit.com/r/ClaudeCode/comments/1rug14a/claude_wrote_playwright_tests_that_secretly/)
+
+### Product checks
+
+- [Jam for Linear](https://jam.dev/linear)
+- [BugBug features](https://bugbug.io/features/)
+- [Momentic documentation](https://momentic.ai/docs)
+- [QA Wolf documentation](https://docs.qawolf.com/qawolf/Welcome-to-QA-Wolf)
diff --git a/docs/roadmap.md b/docs/roadmap.md
index ed11ff4..542e58c 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -187,6 +187,24 @@ Verified result:
- The production landing page and stable GitHub download passed desktop, mobile, redirect, full-download, SHA-256, and disk-image checks.
- The release remains clearly labeled as an unsigned Apple Silicon beta until Apple Developer ID and notarization credentials are available.
+## Milestone 6: Portable evidence handoff - Complete July 20
+
+Deliverables:
+
+- Reddit competitor and practitioner research with explicit product boundaries.
+- Evidence inventory on every agent-created check.
+- Ticket-ready Markdown report copied without uploading local evidence.
+- Ordinary Playwright TypeScript export built from observed structured commands.
+- Updated desktop and mobile release site using a verified product screenshot.
+
+Exit gate:
+
+- Unit tests verify deterministic compilation and legacy-session refusal. The Electron MCP journey reads the report from the system clipboard and validates the exported test. That journey passes against the development build, unpacked production app, and read-only mounted DMG.
+
+Verified result:
+
+- The complete gate passed with 66 unit and integration tests, 10 Electron journeys, two release-site browser viewports, package integrity checks, and two packaged-app MCP runs. Exported tests use no model at run time and remain review-required. Automatic repair, direct issue-tracker OAuth, and managed cloud execution remain out of scope.
+
## Buffer: July 21
Only submission fixes, reliability fixes, and final upload verification. No new product scope.
diff --git a/docs/verification.md b/docs/verification.md
index d29dc8c..ee404fb 100644
--- a/docs/verification.md
+++ b/docs/verification.md
@@ -29,11 +29,22 @@ This file records what has actually been tested. Passing claims must include the
| Computer execution | Verified | Vitest covers screenshot-first and batched action loops, the 25-turn boundary, 60-second provider requests, pending-safety-check stopping, coordinate and key validation, typed-text limits, and application activation. The pinned Apache-2.0 nut.js adapter runs inside TaskTape's stable macOS Accessibility identity. Electron journeys cover deterministic execution and regression evidence. On 2026-07-18, the paired live test used OpenAI computer use to replay the same interaction against broken and fixed browser targets, persisted both final screenshots, and correctly recorded failed and passed verdicts in history in 1 minute 42 seconds. |
| Outcome verification | Verified | Unit tests cover schema-bound passed, failed, and inconclusive evaluation plus persistence. A live evaluator reliability gate classified five consecutive broken and fixed screenshot pairs correctly, for 10 successful GPT-5.6 evaluations in 18.6 seconds on 2026-07-18. The full paired desktop replay then independently confirmed the broken and fixed outcomes through the production evaluator. |
| Agent MCP connection | Verified | Schema and integration tests cover local URL restrictions, selectors, key and wait bounds, action compilation, trace and screenshot persistence, console and network evidence, workflow creation, protocol discovery, and tool invocation. A real SDK MCP client completed the broken fixture through the embedded Electron server; the active session appeared in Settings, the saved check appeared in Checks, and an explicit run reached history. The packaged app independently exposed 12 tools, observed Uncategorized, finished the session, and returned the saved check on 2026-07-18. |
+| Portable check handoff | Verified | Agent actions persist schema-validated replay commands. Unit tests cover Playwright compilation, Markdown reports, evidence lookup, and legacy-session refusal. The Electron MCP journey expands evidence counts, copies and reads the report from the system clipboard, exports TypeScript, and verifies its observed role locator plus visual assertion. The same journey passed against the unpacked 0.3.0 app and the app launched from the read-only mounted DMG on 2026-07-20. |
| Scheduling and run logs | Verified | Vitest verifies local-time hourly, daily, weekday, and weekly calculation, persisted schedules, pause or resume, real due-run filesystem moves, trigger labels, and history loading. The Electron journey saves Monday at 09:00, confirms unattended-run consent, verifies `schedule.json`, forces a file task due, and confirms Manual and Scheduled history entries. A separate computer-task journey verifies the Scheduled inbox, natural cadence, last result, keyboard pause or resume, and Run now availability on 2026-07-17. |
| Completion and playback | Verified | At 1180x760, Playwright confirms the recorded video is wider than 300px and completion exposes rerun, history, and New task actions. A separate empty-folder journey confirms Check again and New task remain available after saving a zero-action plan. Screenshots of voice intent, learned details, computer-task completion, scheduling, approval, completion, empty state, Scheduled, and history were visually inspected on 2026-07-17. |
## Latest automated run
+On 2026-07-20, `pnpm check` passed formatting, lint, both TypeScript projects, 66 tests across 16 files, and the production build. `pnpm test:e2e` then passed all 10 Electron journeys in 29.2 seconds. The agent journey covered the newly generated Markdown report and Playwright test without making a model request. No paid model calls were used for this milestone.
+
+The `pnpm test:site` release check passed in headed Chromium at 1440 by 900 and 390 by 844. It verified the portable-check message and product image, all three stable download links, complete image decoding, no horizontal overflow, and no console errors. The missing favicon found during the first browser run was fixed before this passing result. Both full-page captures were visually inspected.
+
+The 0.3.0 arm64 production app, DMG, and ZIP built successfully with `pnpm package:mac`. The app contains Playwright Chromium 1228, reports version 0.3.0, and passed `codesign --verify --deep --strict` with its ad-hoc seal. `hdiutil verify` reported a valid DMG checksum. The MCP journey passed first against the unpacked production app and again after launching TaskTape directly from the read-only mounted DMG. Both journeys created an agent check, inspected its evidence, copied the report, and exported the Playwright source. The 300,263,493-byte DMG has SHA-256 `6a63aa5cb398226f18504a7c478218842cb1cc1466ee9046f86bfd7af6654710`.
+
+No Apple Developer ID identity is installed on the build Mac, so 0.3.0 is not Apple-signed or notarized. The ad-hoc signature provides bundle integrity but does not satisfy Gatekeeper distribution trust; users may need to approve the beta once through macOS. This remains the only known release-credential blocker.
+
+## Previous release
+
On 2026-07-19, `pnpm check` passed formatting, lint, both TypeScript projects, 62 tests across 15 files, and the production build. `pnpm test:e2e` then passed all 10 Electron journeys in 29.6 seconds. The earlier paid gates remain valid: `pnpm test:live:computer` passed the paired broken and fixed OpenAI-driven desktop replay, and the live evaluator reliability gate passed all 10 evaluations. No additional paid model calls were used for the public-release milestone.
The first nine-journey Electron run on July 18 had one intermittent timeout while a synthetic MediaRecorder transitioned to the intent screen. That journey then passed twice consecutively in isolation, followed by a clean full run of all nine journeys in 20.9 seconds. No evaluator, execution, or persistence assertion failed during the timeout.
@@ -42,4 +53,4 @@ The 0.2.0 arm64 production app, DMG, and ZIP built successfully with `pnpm packa
The static landing page was served locally and exercised in Chromium at 1440 by 900 and 390 by 844. Both viewports loaded the real product images, had no horizontal overflow or console errors, exposed consistent stable DMG links, and copied both MCP commands with visible feedback. Full-page captures were visually inspected. The Vercel production URL returned 200 over HTTPS at both viewports. The complete 300,282,253-byte DMG was downloaded through the landing page's stable GitHub URL, matched the release SHA-256, and passed `hdiutil verify`.
-No Apple Developer ID identity is installed on the build Mac, so 0.2.0 is not Apple-signed or notarized. The ad-hoc signature provides bundle integrity but does not satisfy Gatekeeper distribution trust; users may need to approve the beta once through macOS. This is the only known release-credential blocker.
+No Apple Developer ID identity was installed on the build Mac, so 0.2.0 was not Apple-signed or notarized.
diff --git a/package.json b/package.json
index ee84e55..a86264d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "tasktape",
- "version": "0.2.0",
+ "version": "0.3.0",
"description": "Turn a narrated bug recording into a living regression check.",
"type": "module",
"main": "./out/main/index.js",
@@ -20,6 +20,7 @@
"test:live:computer": "pnpm build && TASKTAPE_LIVE_COMPUTER=1 playwright test --config playwright.live.config.ts",
"test:watch": "vitest",
"test:e2e": "pnpm build && playwright test",
+ "test:site": "PLAYWRIGHT_BROWSERS_PATH=build/playwright-browsers playwright test --config playwright.site.config.ts",
"check": "pnpm format:check && pnpm lint && pnpm typecheck && pnpm test && pnpm build",
"browser:install": "PLAYWRIGHT_BROWSERS_PATH=build/playwright-browsers playwright install --no-shell chromium",
"package:mac": "pnpm browser:install && pnpm build && electron-builder --mac"
diff --git a/playwright.site.config.ts b/playwright.site.config.ts
new file mode 100644
index 0000000..9e22fbc
--- /dev/null
+++ b/playwright.site.config.ts
@@ -0,0 +1,36 @@
+import { defineConfig, devices } from '@playwright/test'
+
+export default defineConfig({
+ testDir: 'tests/site',
+ timeout: 30_000,
+ fullyParallel: false,
+ workers: 1,
+ reporter: 'list',
+ use: {
+ baseURL: 'http://127.0.0.1:4188',
+ headless: false,
+ trace: 'retain-on-failure',
+ screenshot: 'only-on-failure'
+ },
+ projects: [
+ {
+ name: 'desktop',
+ use: { ...devices['Desktop Chrome'], viewport: { width: 1440, height: 900 } }
+ },
+ {
+ name: 'mobile',
+ use: {
+ browserName: 'chromium',
+ viewport: { width: 390, height: 844 },
+ isMobile: true,
+ hasTouch: true
+ }
+ }
+ ],
+ webServer: {
+ command: 'python3 -m http.server 4188 --directory site',
+ url: 'http://127.0.0.1:4188',
+ reuseExistingServer: false
+ },
+ outputDir: 'test-results/site'
+})
diff --git a/site/assets/favicon.png b/site/assets/favicon.png
new file mode 100644
index 0000000..09f8cb4
Binary files /dev/null and b/site/assets/favicon.png differ
diff --git a/site/assets/tasktape-portable-check.png b/site/assets/tasktape-portable-check.png
new file mode 100644
index 0000000..bc12190
Binary files /dev/null and b/site/assets/tasktape-portable-check.png differ
diff --git a/site/index.html b/site/index.html
index fa43c9a..6374fcb 100644
--- a/site/index.html
+++ b/site/index.html
@@ -5,16 +5,17 @@
Give Claude Code or Codex a visible browser it can control through MCP. TaskTape
- preserves the evidence and turns the session into a check your team can replay.
+ preserves the evidence, builds the bug report, and exports a Playwright check your team
+ owns.