{
  "example": true,
  "exampleNotice": "Entirely fictional data illustrating how to record a review. No real product or customer test is represented.",
  "title": "SaaS Mirror web release review",
  "source": "https://saasmirror.com/tools/release-review",
  "checklistVersion": "2026-09-06",
  "exportedAt": "2026-09-06T00:00:00Z",
  "release": "Paper Lantern demo-42 (fictional example)",
  "environment": "Private staging app, sample record book-001",
  "browser": "Illustrative desktop keyboard and phone scenarios; not actual test results",
  "scope": "Manual observations for the cases recorded here. This report is not a release certification or an automated test result.",
  "summary": {
    "unchecked": 11,
    "passed": 3,
    "followup": 2,
    "na": 2,
    "total": 18,
    "missingEvidence": 0
  },
  "checks": [
    {
      "id": "01",
      "group": "Pages and search",
      "title": "Open a direct URL",
      "check": "Paste a nested page URL into a new tab, then reload it. Confirm the intended page loads without visiting the homepage first. Follow its main navigation links and check their destinations.",
      "evidence": "URL, signed-in/out state, resulting page, HTTP status, and any unexpected redirect.",
      "status": "passed",
      "notes": "Example: /books/book-001 opened directly with the sample title The Lantern Manual and a 200 response."
    },
    {
      "id": "02",
      "group": "Pages and search",
      "title": "Use Back and Forward",
      "check": "Open a list, apply a filter, visit a detail page, then use Back and Forward. Compare the restored URL, filter, selection, and scroll position with the intended behavior.",
      "evidence": "Exact route sequence, expected restored state, and actual result.",
      "status": "passed",
      "notes": "Example: Back returned to /books?status=unread and retained the unread filter."
    },
    {
      "id": "03",
      "group": "Pages and search",
      "title": "Visit a missing page",
      "check": "In a test environment, open a route known not to exist. Confirm the page explains the problem, provides a working way onward, and returns the intended missing-page status rather than an ordinary success response.",
      "evidence": "Requested route, HTTP status, visible message, and destination of the recovery link.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "04",
      "group": "Pages and search",
      "title": "Check page identity",
      "check": "For a public page, inspect its title, description, and canonical URL in the delivered HTML and rendered page. Confirm they describe this page, agree with each other, and use the intended public hostname. Open the canonical destination.",
      "evidence": "Actual title, description, canonical URL, destination status, and any source/render difference.",
      "status": "na",
      "notes": "This fictional private staging app is not intended to be indexed publicly. Public page-identity checks are outside this review."
    },
    {
      "id": "05",
      "group": "Pages and search",
      "title": "Check search access",
      "check": "For a page intended for search, inspect robots.txt, robots meta tags, and X-Robots-Tag. Check that no rule unexpectedly blocks crawling or indexing. Follow a real HTML link to the page; verify the public sitemap, if provided, lists the intended canonical URL.",
      "evidence": "URL, relevant rules/header values, linking page, and sitemap entry. This records configuration, not actual indexing.",
      "status": "na",
      "notes": "Private staging remains access-controlled and excluded from public search. No access policies were changed."
    },
    {
      "id": "06",
      "group": "Inputs and feedback",
      "title": "Correct invalid input",
      "check": "Submit a required field empty and a constrained field with an invalid sample value. Check that the error identifies the field and correction, valid input remains available, and correcting the problem allows the intended next step.",
      "evidence": "Sample values, exact error text, retained values, and outcome after correction.",
      "status": "passed",
      "notes": "Example: an empty title produced Enter a title and preserved the other sample input."
    },
    {
      "id": "07",
      "group": "Inputs and feedback",
      "title": "See loading and empty states",
      "check": "Use an existing test fixture or network throttling to slow the relevant request. Then load a known empty fixture. Confirm pending work is distinguishable from a completed result with zero items.",
      "evidence": "Fixture/route, throttling condition, messages shown, and the next action offered in each state.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "08",
      "group": "Inputs and feedback",
      "title": "Recover from failure",
      "check": "In staging, use a documented failure fixture or block the relevant request. Attempt the action, restore normal conditions, and retry once. Check that the error explains a useful next step and the result agrees with the stored state.",
      "evidence": "Failure condition, message, retry steps, and resulting sample record or visible outcome.",
      "status": "followup",
      "notes": "Example failure fixture: save returned an error and cleared the sample notes. A later successful retry does not resolve that earlier data-loss finding."
    },
    {
      "id": "09",
      "group": "Inputs and feedback",
      "title": "Check repeated actions",
      "check": "With a sample record and a deliberately slow staging response, activate the same submit action twice. Check the request sequence and resulting records against the product’s intended duplicate-handling behavior.",
      "evidence": "Number of requests and resulting records, record IDs, and the intended behavior. A disabled button alone is not evidence of one stored operation.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "10",
      "group": "Keyboard and status",
      "title": "Finish with the keyboard",
      "check": "Put the pointer aside. Complete one core journey with Tab, Shift+Tab, Enter, Space, and the keys appropriate to any widgets. Check that the required controls can be reached, operated, and exited.",
      "evidence": "Browser/OS, journey, keystroke sequence, and any unreachable control or trap.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "11",
      "group": "Keyboard and status",
      "title": "Follow visible focus",
      "check": "Tab through the journey and any menus or dialogs. Check that the focused control remains visible, focus moves in a useful order, and closing a dialog returns it to a sensible control.",
      "evidence": "Focus sequence, a screenshot of any missing/covered indicator, and focus location after closing.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "12",
      "group": "Keyboard and status",
      "title": "Hear status changes",
      "check": "With a screen reader, trigger a loading message, a validation/result update, and completion without moving focus to the message. Check which meaningful updates are announced and whether repeated announcements become disruptive.",
      "evidence": "Browser and screen-reader versions, trigger, visible message, announcement heard, and focus location.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "13",
      "group": "Mobile and touch",
      "title": "Read at a narrow width",
      "check": "Test a 320 CSS-pixel viewport, then separately enlarge text to 200% in a browser that supports text-only zoom. Read the main content and reach the primary action. Check for clipped text, overlaps, and lost controls.",
      "evidence": "Viewport or zoom mode, browser, affected route, and screenshot of any obstruction.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "14",
      "group": "Mobile and touch",
      "title": "Tap adjacent controls",
      "check": "On a real touch device, use the main navigation, neighboring buttons, and any menu close control. Check for mistaken activation and functionality that is available only when hovering.",
      "evidence": "Device/browser, controls attempted, observed wrong activations, and whether the intended action remains reachable.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "15",
      "group": "Mobile and touch",
      "title": "Use the on-screen keyboard",
      "check": "Focus the last field of a sample form on a phone. Enter a long sample value, correct it, and reach submit while the keyboard is open. Repeat in landscape if supported by the product.",
      "evidence": "Device/orientation, sample length, obscured field/control, and submission outcome.",
      "status": "followup",
      "notes": "Example: the phone keyboard covered Save in landscape. Record a real device/browser combination when reproducing this in an actual review."
    },
    {
      "id": "16",
      "group": "Release and recovery",
      "title": "Load the released assets",
      "check": "After the staging deployment, repeat a direct load with an empty browser cache, an ordinary reload, and a return visit through browser history. Check for missing scripts/styles and mixed old/new UI. Confirm the intended build where the product exposes a build identifier.",
      "evidence": "Deployment/build identifier, browser, asset failures, relevant cache headers, and result for each navigation type.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "17",
      "group": "Release and recovery",
      "title": "Find a controlled failure",
      "check": "If monitoring exists, trigger one documented, harmless staging error using sample data. Locate the corresponding event and any configured alert. If there is no monitoring, record that gap instead of marking the check passed.",
      "evidence": "Trigger time/time zone, environment, correlation/event ID, recorded message, and observed alert delivery or absence.",
      "status": "unchecked",
      "notes": ""
    },
    {
      "id": "18",
      "group": "Release and recovery",
      "title": "Rehearse the rollback",
      "check": "In staging, restore the recorded previous release using the documented rollback procedure. Verify its build and repeat the primary sample journey, including any data compatibility checks required by the change. Restore the candidate only after recording the result.",
      "evidence": "Previous/candidate build IDs, actual rollback steps, timestamps, and post-rollback journey result. Unrehearsed or incompatible data changes remain unresolved.",
      "status": "unchecked",
      "notes": ""
    }
  ]
}
