This document defines the minimum evidence required before Shopflow can claim:
The goal is simple:
no fresh evidence, no support claim.
Verification guards should also fail readably.
In plain language:
when Shopflow blocks a release path, it should say which contract surface drifted, not just flash a red light.
Shopflow uses five verification levels.
Purpose:
Examples:
Purpose:
Examples:
matches correctnessdetect capability declarationrunAction receipt shape checksPurpose:
Examples:
Purpose:
Examples:
Purpose:
Examples:
| Tier | Fixture | Contract | Integration | E2E | Live Receipt |
|---|---|---|---|---|---|
| Storefront Shell | Required | Required | Required | Required | Recommended by default, required for public verified-scope claims outside trivial single-host copy |
| Capability-heavy Product | Required | Required | Required | Required | Required |
| Capability | Fixture | Contract | E2E | Live Receipt |
|---|---|---|---|---|
extract_product |
Required | Required | Required | Optional unless the release claim depends on live evidence |
extract_search |
Required | Required | Required | Optional unless the release claim depends on live evidence |
extract_deals |
Required | Required | Required | Recommended |
run_action |
Required | Required | Required | Required |
tests/fixtures/<store-id>/<page-kind>/
Examples:
tests/fixtures/albertsons/product/
tests/fixtures/albertsons/cart/
tests/fixtures/albertsons/manage/
tests/fixtures/amazon/search/
tests/fixtures/target/deal/
| Page Kind / Capability | Minimum Fixture Requirement |
|---|---|
product |
at least 1 de-identified HTML fixture |
search |
at least 1 de-identified HTML fixture |
deal |
at least 1 de-identified HTML fixture |
| action-capable page | at least 3 fixtures: pre-action, in-flow/modal, post-action or failure state |
tests/contract/
Suggested file shape:
tests/contract/store-albertsons.contract.test.ts
tests/contract/store-amazon.contract.test.ts
matches(url) accepts owned URLs and rejects foreign URLsdetect() returns storeId, pageKind, verifiedScopes, and capabilityStatesrunAction() returns a complete ActionReceipt when supportedCurrent verification treats the following as blocker-grade residue:
/Users/<name>/..., /home/<name>/..., or C:\\Users\\<name>\\....env files or committed log/db/key/certificate artifactsThis gate is enforced in two layers:
pnpm verify:sensitive-surfaces scans tracked plus non-ignored worktree filespnpm verify:sensitive-history scans reachable Git historypnpm verify:sensitive-public-surface scans the GitHub-hosted public fallback repos plus their issue / PR / release text surfacespnpm verify:github-platform-security reports whether GitHub-native security surfaces are enabled and whether enabled surfaces still carry open alertsIn plain language:
a repo is not clean just because HEAD looks clean; if the live tree or the reachable history or public fallback surface still contains sensitive residue, verification must fail.
tests/integration/
The runtime layer is not considered stable until integration tests prove these paths.
tests/e2e/
Suggested file shape:
tests/e2e/ext-amazon.smoke.spec.ts
tests/e2e/ext-albertsons.smoke.spec.ts
tests/e2e/ext-shopping-suite.smoke.spec.ts
Every released app must have at least one browser-level smoke path proving:
For Capability-heavy Product apps, E2E must additionally prove:
Mechanical guards should prefer category-tagged failures such as:
[path][fixture][claim-boundary][review-start-path][packaging][suite]This keeps local and CI drift triage readable instead of turning every failure into a black box.
For release-readiness tooling, the parity layer should also keep these surfaces mechanically aligned:
Reviewer start-path rule:
defaultHosts entry in the shared store catalogLive receipts are mandatory for:
run_actionThis document defines the required fields, not a permanent raw-evidence storage location.
Raw live evidence may stay outside version control if it contains sensitive surface detail, but a release decision must not be made without the evidence bundle existing somewhere reviewable.
Required live receipt work now moves through explicit review states:
missing-live-receiptcapture-in-progresscapturedreviewedrejectedexpiredRule:
capture-in-progress means the operator is assembling the packet but review cannot start yetcaptured means the bundle exists and is waiting for reviewreviewed means the bundle is acceptable for release decisioningrejected or expired means the bundle does not satisfy the release gateLedger integrity guard:
captured must carry capturedAt plus the latest screenshot labelreviewed must additionally carry reviewedAt, reviewedBy, and reviewSummaryrejected must record why the packet failed reviewexpired must record when trust expiredTo avoid mixing repo truth and marketing truth, Shopflow uses three claim states.
| State | Meaning |
|---|---|
fixture-ready |
local parser and detector logic have stable inputs |
repo-verified |
fixture + contract + integration + E2E bar has passed |
public-claim-ready |
repo-verified plus any required live receipt bar has passed and the evidence bundle has been reviewed |
Rules:
repo-verified before they are public-claim-readypublic-claim-readyAn app is eligible for release only when:
reviewed