{
  "schema": "si-catalogue/1",
  "mode": "candidate",
  "count": 33,
  "detail": "inline",
  "publisher": {
    "name": "Synthetic Industry",
    "url": "https://syntheticindustry.ai",
    "email": "hello@syntheticindustry.ai",
    "address": {
      "streetAddress": "Suite 105, 88 Queen Street",
      "addressLocality": "Sheffield",
      "postalCode": "S1 2FW",
      "addressCountry": "GB"
    }
  },
  "notes": [
    "Requests are email enquiries; sending one does not create an order or a charge.",
    "Nothing is purchasable by checkout yet: lifecycle available_for_purchase will appear only when it is."
  ],
  "procurement": {
    "enquire": "email with SI-Outcome headers",
    "quote": "written proposal after an enquiry",
    "order": "agreed in writing after an enquiry",
    "status": null,
    "acceptance": null
  },
  "categories": [
    {
      "id": "repair",
      "name": "Repair",
      "url": "https://syntheticindustry.ai/services/category/repair/",
      "count": 14,
      "outcomes": [
        "bubble-company-seat-limit-signup",
        "django-import-causes-502",
        "fix-failing-github-actions-job",
        "fix-one-bug-with-regression-test",
        "hosting-disk-full-website-down",
        "laravel-queue-emails-stopped-sending",
        "nextjs-vercel-build-fails",
        "php-contact-form-emails-not-arriving",
        "php-mysql-connect-error-database-repair",
        "shopify-product-tab-after-theme-update",
        "shopify-uninstalled-review-app-residue",
        "ssl-certificate-expired-not-secure",
        "woocommerce-checkout-after-update",
        "wordpress-critical-error-after-update"
      ]
    },
    {
      "id": "upgrade",
      "name": "Upgrades",
      "url": "https://syntheticindustry.ai/services/category/upgrade/",
      "count": 6,
      "outcomes": [
        "codeigniter-3-app-to-codeigniter-4",
        "django-python27-to-supported",
        "email-move-cpanel-mailboxes-to-microsoft-365",
        "hosting-custom-php-site-off-cpanel",
        "laravel-old-app-to-supported-version",
        "php-7-site-to-php-8"
      ]
    },
    {
      "id": "integrate",
      "name": "Integrations and configuration",
      "url": "https://syntheticindustry.ai/services/category/integrate/",
      "count": 8,
      "outcomes": [
        "dns-move-domain-without-email-downtime",
        "email-spf-dkim-dmarc-business-mail-in-spam",
        "hosting-offsite-backups-with-restore-test",
        "shopify-merchant-brand-identifier",
        "stripe-memberstack-access-after-payment",
        "stripe-nextjs-supabase-subscriptions",
        "zapier-facebook-leads-to-salesforce",
        "zapier-sheets-to-xero-missing-columns"
      ]
    },
    {
      "id": "engineering",
      "name": "Engineering lanes and ongoing work",
      "url": "https://syntheticindustry.ai/services/category/engineering/",
      "count": 5,
      "outcomes": [
        "clear-engineering-backlog",
        "keep-github-actions-ci-green",
        "operate-software-engineering",
        "ship-one-feature-with-running-preview",
        "vibe-engineering-lane"
      ]
    }
  ],
  "outcomes": [
    {
      "id": "bubble-company-seat-limit-signup",
      "url": "https://syntheticindustry.ai/services/bubble-company-seat-limit-signup/",
      "name": "Stop a Bubble signup from adding users beyond a seat limit",
      "summary": "On a Bubble development copy, the third user can register and the fourth cannot create an account; a no-code signup follows the agreed default path.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "bubble"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £225 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 225,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If seat rules change regularly, discuss a recurring signup and access regression check. Billing ownership and incident response would need a separate agreement."
      },
      "result": "On a Bubble development copy, the third user can register and the fourth cannot create an account; a no-code signup follows the agreed default path.",
      "includes": [
        "Fix company-code signup and seat-count check for one company plan",
        "Test seats two, three and four, concurrent attempts for the last seat, and invalid and empty codes on a development copy"
      ],
      "excludes": [
        "A new billing system or changing plan prices",
        "Migrating or deleting existing production users",
        "An enterprise permission audit",
        "Changing the number of plans or company hierarchy"
      ],
      "eligibility": [
        "Owner can reproduce the overflow with dummy company users",
        "A development Bubble version and an owner-approved copy of seat rules exist"
      ],
      "stop_conditions": [
        "Multiple concurrent signup requests can bypass the planned check and no safe server-side enforcement exists within scope",
        "Company plans or seat ownership rules have not been decided"
      ],
      "inputs": {
        "initial": [
          "Screenshots of signup and company-code popup with names removed",
          "Expected counts for three-seat company and invalid/blank codes"
        ],
        "after_agreement": [
          "Owner-provided development editor permission",
          "Dummy company and four disposable user accounts",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "For a three-seat dummy company user three joins, while user four receives a warning and no account is created",
          "evidence": "Screenshots of popup, company user count and user search"
        },
        {
          "check": "Invalid company code creates no company user; blank code follows the owner-approved standalone signup path",
          "evidence": "Five-case signup matrix with database counts"
        },
        {
          "check": "With one seat remaining, two simultaneous dummy signup requests create exactly one company member; repeat at the full limit and create none. If the platform cannot enforce this safely, stop without calling it fixed.",
          "evidence": "Timestamped request results and company/member counts before and after both concurrent attempts."
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "can-a-fourth-dummy-user-join-a-three-seat-company",
          "ask": "Can a fourth dummy user join a three-seat company?",
          "answers": [
            {
              "label": "Yes, overflow persists",
              "result": "fit"
            },
            {
              "label": "No, fourth is blocked",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "do-you-have-a-bubble-development-version-and-disposable-users",
          "ask": "Do you have a Bubble development version and disposable users?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, only live accounts",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "is-the-allowed-seat-count-stored-for-each-company",
          "ask": "Is the allowed seat count stored for each company?",
          "answers": [
            {
              "label": "Yes, clear rule",
              "result": "fit"
            },
            {
              "label": "No agreed rule",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "bubble-company-seat-limit-signup",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/bubble-company-seat-limit-signup/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=bubble-company-seat-limit-signup&source=%2Fservices%2Fbubble-company-seat-limit-signup%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=bubble-company-seat-limit-signup&body=SI-Outcome%3A%20bubble-company-seat-limit-signup%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fbubble-company-seat-limit-signup%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "clear-engineering-backlog",
      "url": "https://syntheticindustry.ai/services/clear-engineering-backlog/",
      "name": "Clear a defined backlog of bugs and small engineering tasks",
      "summary": "Give us a list of bugs and small tasks. We agree the list and a fixed price, then return the whole list as accepted, tested changes.",
      "level": "project",
      "category": "engineering",
      "buyer_type": "founder-or-cto",
      "technology": [
        "web-applications",
        "github"
      ],
      "version": "2026-10-10",
      "lifecycle": "candidate",
      "sale": {
        "mode": "quote",
        "cta": "Request a proposal"
      },
      "price": {
        "model": "from",
        "amount": 2500,
        "currency": "GBP",
        "period": null,
        "payment": "The payment schedule is set in the written proposal. Nothing is charged until you have agreed it.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "cancellation": "Before work starts you can walk away without charge. Once it has started, the proposal sets what you owe for the items finished so far.",
        "refund": "Refund terms are written into the proposal before you agree to anything."
      },
      "result": "You buy the finished list, not the individual tickets. Every agreed item comes back fixed, tested and accepted by you, or is removed from the list in writing.",
      "includes": [
        "One agreed list of bugs and small tasks on one product",
        "Each item fixed or built with a test that would have caught it, and run in a private preview where it changes what a user sees",
        "A fixed price for the agreed list, set after we have read it",
        "A written final summary showing each item and how it ended"
      ],
      "excludes": [
        "Items added after the price is agreed, unless you add them to the list in writing",
        "Large features, redesigns, migrations or anything that is really a new project",
        "Production access, deployments or data, which stay with your team",
        "A guarantee that every item on a draft list is possible; items that are not are named and removed or re-scoped with you"
      ],
      "eligibility": [
        "Each item is described well enough to reproduce or to test, or you can help us do so",
        "The product can run in isolation with test data that holds no customer information",
        "A person on your side can accept changes"
      ],
      "stop_conditions": [
        "Most items cannot be reproduced or tested without production access",
        "The list is really one big project, so we propose a different scope",
        "Nobody can accept changes on your side"
      ],
      "inputs": {
        "initial": [
          "A link to the list of issues or tickets (a link only)",
          "The items you care most about, in order",
          "A paragraph on what the product does and how you run it"
        ],
        "after_agreement": [
          "Read access to a repository or fork you control, with no production access",
          "Run instructions and synthetic test data",
          "A named person to accept each item"
        ]
      },
      "acceptance": [
        {
          "check": "Every item on the agreed list is either accepted by you or removed from the list in writing.",
          "evidence": "The final summary, with your acceptance or removal recorded for each item."
        },
        {
          "check": "Each fixed bug has a regression test that fails without the fix and passes with it.",
          "evidence": "The test output before and after, attached to each pull request."
        },
        {
          "check": "The whole test suite passes with every accepted change applied.",
          "evidence": "A passing run of the full suite on the combined branch."
        }
      ],
      "components": [
        {
          "outcome": "fix-failing-github-actions-job",
          "role": "precondition",
          "contributes": "informational",
          "needs": []
        },
        {
          "outcome": "fix-one-bug-with-regression-test",
          "role": "included",
          "contributes": "required",
          "needs": [
            "fix-failing-github-actions-job"
          ]
        },
        {
          "outcome": "ship-one-feature-with-running-preview",
          "role": "optional",
          "contributes": "counts",
          "needs": []
        }
      ],
      "part_of": [
        "operate-software-engineering",
        "vibe-engineering-lane"
      ],
      "completion": {
        "rule": "all_required",
        "text": "The project is complete when every item on the agreed list has been accepted by you or removed from the list in writing. You accept the finished list, not each internal step."
      },
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": null,
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "clear-engineering-backlog",
          "SI-Mode": "quote",
          "SI-Page": "https://syntheticindustry.ai/services/clear-engineering-backlog/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=clear-engineering-backlog&source=%2Fservices%2Fclear-engineering-backlog%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=clear-engineering-backlog&body=SI-Outcome%3A%20clear-engineering-backlog%0ASI-Mode%3A%20quote%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fclear-engineering-backlog%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "quote"
      }
    },
    {
      "id": "codeigniter-3-app-to-codeigniter-4",
      "url": "https://syntheticindustry.ai/services/codeigniter-3-app-to-codeigniter-4/",
      "name": "Convert one small CodeIgniter 3 app to CodeIgniter 4",
      "summary": "Inventory every route in a small CodeIgniter 3 app, convert its production paths to CodeIgniter 4, and test five key flows in depth before the site holder switches it live.",
      "level": "atomic",
      "category": "upgrade",
      "buyer_type": "owner-without-developer",
      "technology": [
        "codeigniter",
        "php",
        "mysql"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — from £995"
      },
      "price": {
        "model": "from",
        "amount": 995,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "After the conversion, discuss maintaining the supported runtime and rerunning the agreed business flows when dependencies change."
      },
      "result": "One CodeIgniter 3 application’s agreed login, read and write flows work in a CodeIgniter 4 staging version, with changed source and database migration steps ready for the authorised site holder.",
      "includes": [
        "One small CodeIgniter 3 application with one database, a bounded route inventory and up to five critical business flows",
        "Inventory and convert every production route, controller, model, filter, view and scheduled/API path needed for live use",
        "Move existing behaviour into a CodeIgniter 4 structure without redesigning the business flows",
        "Smoke-check every inventoried route and API response, and deeply test the five critical flows on a safe copy"
      ],
      "excludes": [
        "A CodeIgniter 3 app that only needs a PHP-version compatibility patch",
        "WordPress or Laravel applications",
        "New features, redesign or changing the database platform",
        "Rewriting undocumented third-party packages with no CodeIgniter 4 equivalent",
        "Live deployment or production credentials"
      ],
      "eligibility": [
        "The app is CodeIgniter 3, and the source and database schema are available",
        "Someone can create a safe copy of the files and a sanitised database",
        "You can name up to five flows the business needs to keep working",
        "A site holder can approve the staging result and deploy it under your account",
        "Every required live route and API consumer can be listed and smoke-tested, not only the five headline workflows"
      ],
      "stop_conditions": [
        "An essential closed-source package has no CodeIgniter 4 compatible version or replacement",
        "There is no safe way to copy and test the database without exposing regulated data",
        "The app is really CodeIgniter 2 or a customised framework fork with no clear upgrade route",
        "A database change is irreversible and there is no rehearsed restore",
        "The route/API inventory is too large or undocumented to fit the agreed small-app conversion scope"
      ],
      "inputs": {
        "initial": [
          "The app’s address, CodeIgniter version and current PHP version if known",
          "The five pages or flows staff use most, including one that changes a record",
          "Any host deadline or notice about the old runtime",
          "Who owns the source, database and hosting accounts"
        ],
        "after_agreement": [
          "A copy of the source with configuration secrets removed",
          "A sanitised database copy and test logins with no real customer data",
          "A staging location and an authorised holder to deploy the approved change",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "Every inventoried production route has a CodeIgniter 4 equivalent with the expected status and access restriction on staging",
          "evidence": "Complete route map and smoke-check result for normal and unauthorised test users"
        },
        {
          "check": "The five agreed critical flows each read and write the expected test records once, and every other inventoried route responds with its expected status",
          "evidence": "Before/after test records and flow checklist"
        },
        {
          "check": "Staging logs show no framework fatal errors during the named flows, and the dependency install succeeds on the agreed PHP runtime",
          "evidence": "Redacted error log and dependency install output"
        },
        {
          "check": "A restore on a test environment brings back the CodeIgniter 3 app and the pre-migration database snapshot",
          "evidence": "Restore log and old-app test result"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "version",
          "ask": "Which framework version does the app use?",
          "answers": [
            {
              "label": "CodeIgniter 3",
              "result": "fit"
            },
            {
              "label": "CodeIgniter 2 or older",
              "result": "stop"
            },
            {
              "label": "Laravel, WordPress or something else",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "need",
          "ask": "What made you consider a framework move?",
          "answers": [
            {
              "label": "We need the whole app on CodeIgniter 4",
              "result": "fit"
            },
            {
              "label": "Only the PHP version changed and one page broke",
              "result": "stop"
            }
          ]
        },
        {
          "id": "copy",
          "ask": "Can the site holder provide a safe copy of source and database?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "flows",
          "ask": "Can you name the business flows the new app must keep?",
          "answers": [
            {
              "label": "Yes, up to five",
              "result": "fit"
            },
            {
              "label": "No, nobody knows what it does",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "codeigniter-3-app-to-codeigniter-4",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/codeigniter-3-app-to-codeigniter-4/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=codeigniter-3-app-to-codeigniter-4&source=%2Fservices%2Fcodeigniter-3-app-to-codeigniter-4%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=codeigniter-3-app-to-codeigniter-4&body=SI-Outcome%3A%20codeigniter-3-app-to-codeigniter-4%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fcodeigniter-3-app-to-codeigniter-4%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "django-import-causes-502",
      "url": "https://syntheticindustry.ai/services/django-import-causes-502/",
      "name": "Keep a Django site responsive during a long data import",
      "summary": "One agreed sample import is queued and reports a completed or failed result without a 502; ordinary pages stay responsive on a test copy.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "django",
        "celery",
        "nginx"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — from £395"
      },
      "price": {
        "model": "from",
        "amount": 395,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If imports run often, discuss monitoring their completion, failed-job alerts and periodic retry-safety checks."
      },
      "result": "One agreed sample import is queued and reports a completed or failed result without a 502; ordinary pages stay responsive on a test copy.",
      "includes": [
        "Move one existing import action to a background Celery task on a staging copy",
        "Add visible job status and failure feedback; test retry safety on a disposable dataset"
      ],
      "excludes": [
        "A new data pipeline or unlimited file sizes",
        "Buying or managing a queue provider account",
        "Repair of corrupt historic imports",
        "Guaranteeing uptime during a host outage"
      ],
      "eligibility": [
        "The app already has a working Celery queue and an isolated staging worker; provisioning a new queue is outside this price.",
        "A disposable sample file and expected imported row count are available"
      ],
      "stop_conditions": [
        "The 502 happens before the import starts because Nginx/Gunicorn is down",
        "The import has non-idempotent live external effects or handles regulated data without a safe fixture"
      ],
      "inputs": {
        "initial": [
          "Redacted 502 timestamp and import size/duration",
          "Whether other pages fail and whether Celery exists"
        ],
        "after_agreement": [
          "Staging copy and dummy import file",
          "Existing test queue and isolated worker, with outgoing effects disabled",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "A synthetic import returns an immediate job receipt; completion reports the agreed row count without browser 502",
          "evidence": "Staging page screenshot, job ID and redacted row-count report"
        },
        {
          "check": "A failed file reports an error and retry does not duplicate rows already imported",
          "evidence": "Failed-job log and before/after test table counts"
        },
        {
          "check": "During the agreed import, each named ordinary page responds without 502 and within the response-time ceiling agreed from the baseline; the status page remains readable.",
          "evidence": "Timed page requests before and during the import, linked to its job ID and completion result."
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "does-the-502-appear-only-when-the-import-runs",
          "ask": "Does the 502 appear only when the import runs?",
          "answers": [
            {
              "label": "Yes, only import",
              "result": "fit"
            },
            {
              "label": "No, every page is down",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-a-dummy-file-reproduce-the-timeout-safely",
          "ask": "Can a dummy file reproduce the timeout safely?",
          "answers": [
            {
              "label": "Yes, synthetic file",
              "result": "fit"
            },
            {
              "label": "No, only live customer file",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "is-a-test-queue-or-approved-test-broker-available",
          "ask": "Is a test queue or approved test broker available?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, cannot run a queue",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "django-import-causes-502",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/django-import-causes-502/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=django-import-causes-502&source=%2Fservices%2Fdjango-import-causes-502%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=django-import-causes-502&body=SI-Outcome%3A%20django-import-causes-502%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fdjango-import-causes-502%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "django-python27-to-supported",
      "url": "https://syntheticindustry.ai/services/django-python27-to-supported/",
      "name": "Move a Django 1.11 site off Python 2.7 on a test copy",
      "summary": "A bounded existing app builds and its agreed pages, login and form flow pass on a test copy using Python 3.12 and Django 5.2; no production switch is implied.",
      "level": "atomic",
      "category": "upgrade",
      "buyer_type": "owner-without-developer",
      "technology": [
        "django",
        "python"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — from £1,495"
      },
      "price": {
        "model": "from",
        "amount": 1495,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "After the upgrade, discuss keeping dependencies supported and the named business routes tested as the app changes."
      },
      "result": "A bounded existing app builds and its agreed pages, login and form flow pass on a test copy using Python 3.12 and Django 5.2; no production switch is implied.",
      "includes": [
        "One Django app with up to ten agreed routes and one database on a test copy",
        "Update Python syntax, Django APIs and supported dependencies needed for those routes"
      ],
      "excludes": [
        "Full rewrite of a large Django estate",
        "New features, UI redesign or database engine migration",
        "Production data migration or live hosting switch",
        "Fixing private packages with no supported release"
      ],
      "eligibility": [
        "Owner can supply the full source, dependency list and sanitised database fixture",
        "Ten business-critical routes, forms and login can be agreed before a fixed-scope assessment"
      ],
      "stop_conditions": [
        "No source or dependency licences are available",
        "Unbounded app count, unknown third-party package, regulated data or destructive migrations demand a separate quote"
      ],
      "inputs": {
        "initial": [
          "Django/Python versions and redacted requirements file",
          "List of ten critical routes and whether current login works"
        ],
        "after_agreement": [
          "Authorised code handoff and synthetic test data",
          "Local/staging environment details under owner control",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "The agreed ten routes render on Python 3.12 and Django 5.2 with no new 500 responses",
          "evidence": "Version outputs, route status list and browser screenshots"
        },
        {
          "check": "Owner-approved login and form submission work against synthetic data and migrations complete on disposable database only",
          "evidence": "Redacted test account login, saved test row and migration log"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "does-the-current-application-run-django-1-11-with-python-2-7",
          "ask": "Does the current application run Django 1.11 with Python 2.7?",
          "answers": [
            {
              "label": "Yes, both versions",
              "result": "fit"
            },
            {
              "label": "No, newer or unknown stack",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-make-a-safe-copy-without-live-customer-records",
          "ask": "Can you make a safe copy without live customer records?",
          "answers": [
            {
              "label": "Yes, source and dummy data",
              "result": "fit"
            },
            {
              "label": "No backup or safe data",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "are-the-critical-routes-and-dependency-licences-available",
          "ask": "Are the critical routes and dependency licences available?",
          "answers": [
            {
              "label": "Yes, named routes",
              "result": "fit"
            },
            {
              "label": "No, missing core package",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "django-python27-to-supported",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/django-python27-to-supported/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=django-python27-to-supported&source=%2Fservices%2Fdjango-python27-to-supported%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=django-python27-to-supported&body=SI-Outcome%3A%20django-python27-to-supported%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fdjango-python27-to-supported%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "dns-move-domain-without-email-downtime",
      "url": "https://syntheticindustry.ai/services/dns-move-domain-without-email-downtime/",
      "name": "Move your domain’s DNS with a plan to protect website and email",
      "summary": "Move one domain’s nameservers to a new DNS provider. Compare mail and website records before the switch, then check the services after it; cached DNS can delay recovery.",
      "level": "atomic",
      "category": "integrate",
      "buyer_type": "owner-without-developer",
      "technology": [
        "dns",
        "domains",
        "email",
        "cloudflare"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £195 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 195,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If your services change often, discuss scheduled DNS inventory and mail-routing checks rather than repeated emergency cutovers."
      },
      "result": "Your domain uses the new authoritative DNS provider, with the agreed website and mail service records copied and checked, and the site and two-way email still working after caches settle. The domain stays in an account you control.",
      "includes": [
        "One authoritative DNS nameserver move for one domain with up to 60 service records; registrar-only transfer is not included",
        "An inventory of mail, website, verification and other service records from the old provider’s export and public lookups",
        "Building the service records at the new DNS provider before changing nameservers",
        "Comparing MX, address, alias, TXT and agreed subdomain answers, excluding provider-specific NS and SOA records",
        "A DNSSEC plan before cutover: remove or replace the registrar DS in the safe order, with an authorised holder",
        "Mail and website checks after the nameserver change and again after caches settle"
      ],
      "excludes": [
        "Moving the website's files or the mailboxes themselves to a new host or provider",
        "Disputes over who owns the domain",
        "Setting up SPF, DKIM or DMARC that wasn't there before: that is a separate job",
        "Domains with more than about 60 records or dozens of subdomains, which we quote separately",
        "Registrar-only ownership transfer with no DNS change: ask the registrar for its account-transfer steps"
      ],
      "eligibility": [
        "The domain is registered to you or your business, even if someone else's account holds it",
        "Someone can log in to the current provider, or the current holder will follow the steps",
        "You have, or will create, an account in your own name at the new DNS provider or registrar",
        "The current nameserver holder can export the full zone and leave it live during the cache window",
        "The domain holder can change nameservers and any DNSSEC DS record at the registrar"
      ],
      "stop_conditions": [
        "The current holder refuses to release the domain or you can't show it's yours: that needs the registrar's dispute process",
        "DNSSEC is switched on and the old provider won't remove or hand over the keys before the move",
        "The move must happen within hours and the old records' lifetimes are too long to switch safely",
        "The domain is expired or in redemption: renew or recover it first",
        "The old provider will shut down before its cached answers expire and no safe overlap can be arranged"
      ],
      "inputs": {
        "initial": [
          "The domain name and where it's registered now, if you know",
          "Who controls the current account: you, your host, a designer or an agency",
          "Where you want it to go: a named registrar, your new host or Cloudflare",
          "Who provides your email, and every other tool you know uses the domain, such as a booking or newsletter service",
          "Any deadline, such as a renewal date or a host closing"
        ],
        "after_agreement": [
          "An export or screenshots of every record at the current DNS provider",
          "An invitation to the new DNS provider account with permission to edit DNS only, or a person there who will enter records",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "Before the switch, every agreed website, mail, verification and subdomain service record answers as planned at the new provider; NS/SOA and DNSSEC are compared by cutover plan, not expected to match byte-for-byte",
          "evidence": "Record-by-record comparison table"
        },
        {
          "check": "After the switch and after the old TTL expires, public lookups show the new nameservers and the agreed MX, SPF and website service answers",
          "evidence": "Lookup output after the switch and the next day"
        },
        {
          "check": "An outside test email reaches the inbox, its reply reaches the outside address, and authentication results are no worse than the recorded pre-switch headers",
          "evidence": "The two messages and their headers"
        },
        {
          "check": "Your website's home page and one agreed inner page load over https on the domain with and without www",
          "evidence": "Status and screenshot per address"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "whose-domain",
          "ask": "Is the domain registered to you or your business?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "It's in my designer's or agency's account",
              "result": "fit"
            },
            {
              "label": "Someone else claims it",
              "result": "stop"
            }
          ]
        },
        {
          "id": "expired",
          "ask": "Is the domain currently paid up and working?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "It expired or stopped working",
              "result": "stop"
            }
          ]
        },
        {
          "id": "what-moves",
          "ask": "What are you moving?",
          "answers": [
            {
              "label": "The nameservers or DNS provider",
              "result": "fit"
            },
            {
              "label": "Only the registrar account, keeping the nameservers",
              "result": "stop"
            },
            {
              "label": "The website’s files and database too",
              "result": "check"
            },
            {
              "label": "Mailboxes to a new email provider too",
              "result": "check"
            }
          ]
        },
        {
          "id": "dnssec",
          "ask": "Does your current provider show DNSSEC as switched on?",
          "answers": [
            {
              "label": "No, confirmed disabled",
              "result": "fit"
            },
            {
              "label": "Yes",
              "result": "check"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "when",
          "ask": "When does it need to happen?",
          "answers": [
            {
              "label": "Within the next few weeks",
              "result": "fit"
            },
            {
              "label": "Today, the old provider is cutting us off",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "dns-move-domain-without-email-downtime",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/dns-move-domain-without-email-downtime/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=dns-move-domain-without-email-downtime&source=%2Fservices%2Fdns-move-domain-without-email-downtime%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=dns-move-domain-without-email-downtime&body=SI-Outcome%3A%20dns-move-domain-without-email-downtime%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fdns-move-domain-without-email-downtime%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "email-move-cpanel-mailboxes-to-microsoft-365",
      "url": "https://syntheticindustry.ai/services/email-move-cpanel-mailboxes-to-microsoft-365/",
      "name": "Move up to five cPanel mailboxes to Microsoft 365",
      "summary": "Copy up to five hosted business mailboxes and their old messages into Microsoft 365, switch incoming mail safely, and prove new and old mail are present.",
      "level": "atomic",
      "category": "upgrade",
      "buyer_type": "owner-without-developer",
      "technology": [
        "email",
        "cpanel",
        "microsoft-365",
        "dns"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £295 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 295,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "For a changing team, discuss a bounded mailbox onboarding and offboarding service. Licence costs and account authority remain yours."
      },
      "result": "Up to five agreed mailboxes receive new mail in Microsoft 365 and contain their old messages through an agreed cut-off date, with no missing sample folders or messages.",
      "includes": [
        "Up to five IMAP mailboxes, each up to 10 GB, from one host to tenant accounts you own",
        "An inventory of mailbox sizes, aliases, forwarding rules and DNS mail records",
        "An initial IMAP copy, a delta copy and MX switch by the domain holder",
        "Tests of incoming, outgoing and old-folder access for each mailbox",
        "Recreating the agreed aliases and forwarding rules in Microsoft 365 before MX changes"
      ],
      "excludes": [
        "Microsoft 365 licences or creating the tenant on your behalf",
        "Calendar, contacts and task migration unless the old host exports them in a separately agreed format",
        "More than five mailboxes or 10 GB per mailbox",
        "Archiving or legal discovery guarantees",
        "Moving the website or its DNS hosting to a new provider"
      ],
      "eligibility": [
        "You own the domain and can change its MX and related records",
        "You have Microsoft 365 licences and can create the destination mailboxes",
        "The old host permits IMAP access and can keep the old mailboxes active during the move",
        "Each source mailbox is at most 10 GB"
      ],
      "stop_conditions": [
        "The old mailboxes are unavailable or the provider will not allow an export",
        "A legal hold, regulated records or jurisdiction rule requires a specialist migration plan",
        "Microsoft 365 tenancy or domain verification has not been set up and nobody can approve it",
        "The business cannot allow a staged change and the old host shuts off immediately"
      ],
      "inputs": {
        "initial": [
          "The domain, old mail provider and how many mailboxes you have",
          "Approximate mailbox sizes and the date the old host closes",
          "Whether Microsoft 365 accounts and licences already exist",
          "Who controls the domain’s DNS"
        ],
        "after_agreement": [
          "Client-controlled IMAP access to the old mailboxes and scoped migration permissions at Microsoft 365, through an authorised handoff rather than passwords in email",
          "A list of every mailbox, alias and forwarding rule, plus one dated historic message per mailbox to sample",
          "An authorised domain holder for the MX change and staff to sign in and check their own folders",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "For each mailbox, the destination has the same agreed folder names and a sample of old and recent messages in Inbox and Sent",
          "evidence": "Folder counts and dated sample message IDs before/after"
        },
        {
          "check": "After the MX switch, a message from outside reaches each destination mailbox and a reply returns without a bounce",
          "evidence": "Two-way test messages and headers per mailbox"
        },
        {
          "check": "Each agreed alias and forwarder is present in Microsoft 365 and a test message sent to it reaches the named destination account",
          "evidence": "Test message and destination per alias"
        },
        {
          "check": "The old provider remains available for a defined catch-up window and the final delta copy includes messages received during the switch",
          "evidence": "Delta-copy log and time-stamped sample"
        },
        {
          "check": "Source and destination folder-level message counts reconcile after the final delta, with every skipped or failed item resolved before acceptance; samples alone do not establish complete migration.",
          "evidence": "Per-folder migration report, error/retry log and client-confirmed reconciliation, excluding only items explicitly outside the agreed scope."
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "source",
          "ask": "Where does your email live now?",
          "answers": [
            {
              "label": "Mailboxes bundled with cPanel or web hosting",
              "result": "fit"
            },
            {
              "label": "Google Workspace or another modern cloud provider",
              "result": "check"
            }
          ]
        },
        {
          "id": "destination",
          "ask": "Do you already have Microsoft 365 business licences and accounts?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "Not yet",
              "result": "check"
            }
          ]
        },
        {
          "id": "size",
          "ask": "How many mailboxes and how large are they?",
          "answers": [
            {
              "label": "Up to five, at most 10 GB each",
              "result": "fit"
            },
            {
              "label": "More or larger",
              "result": "check"
            }
          ]
        },
        {
          "id": "old-host",
          "ask": "Can the old host leave email running while the copy and switch happen?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, it is already closed",
              "result": "stop"
            }
          ]
        },
        {
          "id": "dns-holder",
          "ask": "Can someone change your domain’s MX record at the agreed time?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "email-move-cpanel-mailboxes-to-microsoft-365",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/email-move-cpanel-mailboxes-to-microsoft-365/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=email-move-cpanel-mailboxes-to-microsoft-365&source=%2Fservices%2Femail-move-cpanel-mailboxes-to-microsoft-365%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=email-move-cpanel-mailboxes-to-microsoft-365&body=SI-Outcome%3A%20email-move-cpanel-mailboxes-to-microsoft-365%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Femail-move-cpanel-mailboxes-to-microsoft-365%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "email-spf-dkim-dmarc-business-mail-in-spam",
      "url": "https://syntheticindustry.ai/services/email-spf-dkim-dmarc-business-mail-in-spam/",
      "name": "Set up SPF, DKIM and DMARC for business mail going to spam",
      "summary": "Authenticate mail from your domain across your mailboxes and up to three other sending tools. Check headers and DMARC reports; inbox placement cannot be guaranteed.",
      "level": "atomic",
      "category": "integrate",
      "buyer_type": "owner-without-developer",
      "technology": [
        "dns",
        "email",
        "spf",
        "dkim",
        "dmarc"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £195 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 195,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If you add senders regularly, discuss ongoing DMARC report review and checks before each new sending service is enabled."
      },
      "result": "Mail from each agreed sender passes an aligned authentication check in a Gmail and Outlook.com test message; your domain publishes a monitoring DMARC policy and you receive a two-week report review. Inbox placement is not guaranteed.",
      "includes": [
        "An owner-supplied inventory of every known service that sends as your domain, checked against DNS and available DMARC reports; reports alone do not list every legitimate sender",
        "One correct SPF record within the 10-lookup limit",
        "DKIM switched on and published for each agreed sender, signed with your own domain",
        "A DMARC record that starts by monitoring, with reports sent to a mailbox you choose",
        "One review of the first two weeks of DMARC reports, and a recommendation on tightening the policy"
      ],
      "excludes": [
        "Mailing-list hygiene, bought lists or cold-email campaigns",
        "Getting your server's IP address removed from a blocklist after a compromise",
        "Moving mailboxes to a new email provider",
        "Fixing the code of a website form that sends with PHP mail(): that is a separate job",
        "Ongoing monitoring of DMARC reports after the two-week review"
      ],
      "eligibility": [
        "You send from your own domain, such as you@yourbusiness.co.uk, not a free Gmail or Outlook.com address",
        "Someone can add or change DNS records for the domain, or can say who holds the domain account",
        "The services that send as your domain are ones you use and can log in to, up to the agreed number",
        "The problem is legitimate business mail being filtered, not marketing to people who didn't ask for it"
      ],
      "stop_conditions": [
        "The domain is held by someone who won't make changes or hand it over",
        "Mail is being rejected because your server or account was compromised and is sending spam",
        "Messages are bulk marketing to bought or scraped lists",
        "A sending service can't sign with your domain and can't be replaced: we tell you which one and why"
      ],
      "inputs": {
        "initial": [
          "Your domain name",
          "Who provides your mailboxes: Google Workspace, Microsoft 365, your web host or another provider",
          "Every tool you know of that sends email as your domain, such as invoicing, booking, shop or newsletter software",
          "A bounce message or a customer's description of where your mail landed, with personal details removed",
          "Who can edit the domain's DNS: you, your web host, an IT firm or a former web designer"
        ],
        "after_agreement": [
          "One test message from each agreed sender to test inboxes we give you",
          "Screenshots or an export of the domain's current DNS records, if the provider allows it",
          "A mailbox or alias for DMARC reports, such as dmarc@yourbusiness.co.uk",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "Public DNS returns exactly one SPF record for the domain, with no more than 10 DNS lookups, and a DMARC record with reports addressed to your mailbox",
          "evidence": "Output of the DNS lookups before and after"
        },
        {
          "check": "A test message from each agreed sender to Gmail and Outlook.com shows DMARC pass through aligned SPF or DKIM, with DKIM also passing where the sender supports it",
          "evidence": "The Authentication-Results header from each message"
        },
        {
          "check": "Each test message is accepted by Gmail and Outlook.com without an authentication bounce; we record its actual Inbox or Junk placement without promising it will always remain there",
          "evidence": "Screenshot of the inbox and the message headers"
        },
        {
          "check": "After about two weeks, DMARC reports show each agreed sender passing, and any unknown sender is listed with a recommendation",
          "evidence": "Summary table of the reports for the period"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "own-domain",
          "ask": "Do you send from your own domain, such as you@yourbusiness.co.uk?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, a Gmail, Outlook.com or Yahoo address",
              "result": "stop"
            }
          ]
        },
        {
          "id": "dns-holder",
          "ask": "Who can change your domain's DNS records?",
          "answers": [
            {
              "label": "Me, or a host or IT firm that will",
              "result": "fit"
            },
            {
              "label": "A former web designer or agency",
              "result": "check"
            },
            {
              "label": "Nobody knows",
              "result": "check"
            }
          ]
        },
        {
          "id": "senders",
          "ask": "How many different tools send email as your domain?",
          "answers": [
            {
              "label": "One to four",
              "result": "fit"
            },
            {
              "label": "Five or more",
              "result": "check"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "what-mail",
          "ask": "What kind of email is going missing?",
          "answers": [
            {
              "label": "Everyday business mail: quotes, invoices, replies",
              "result": "fit"
            },
            {
              "label": "Newsletters to customers who opted in",
              "result": "fit"
            },
            {
              "label": "Marketing to bought or scraped lists",
              "result": "stop"
            }
          ]
        },
        {
          "id": "compromise",
          "ask": "Has anyone reported spam sent from your address that you didn't write, or has your host warned you about outgoing spam?",
          "answers": [
            {
              "label": "No",
              "result": "fit"
            },
            {
              "label": "Yes",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "email-spf-dkim-dmarc-business-mail-in-spam",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/email-spf-dkim-dmarc-business-mail-in-spam/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=email-spf-dkim-dmarc-business-mail-in-spam&source=%2Fservices%2Femail-spf-dkim-dmarc-business-mail-in-spam%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=email-spf-dkim-dmarc-business-mail-in-spam&body=SI-Outcome%3A%20email-spf-dkim-dmarc-business-mail-in-spam%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Femail-spf-dkim-dmarc-business-mail-in-spam%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "fix-failing-github-actions-job",
      "url": "https://syntheticindustry.ai/services/fix-failing-github-actions-job/",
      "name": "Fix one failing GitHub Actions job and show a green run",
      "summary": "One failing job in one workflow runs green on your pull request branch, on the same trigger, with the before and after logs attached. You review and merge the change.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "founder-or-cto",
      "technology": [
        "github-actions",
        "github"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £149 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 149,
        "currency": "GBP",
        "period": null,
        "payment": "£149 after the agreed job passes on the pull request branch and you sign off. No payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off"
      },
      "result": "The named job passes on the pull request branch using the same trigger and agreed runner context. You receive the repair pull request with redacted before and after run logs, review it and merge it under your own rules.",
      "includes": [
        "One failing job in one GitHub Actions workflow in one repository; a matrix job is limited to the failing configuration named in the agreement",
        "Read the failed run log and reproduce the same failure on an authorised branch before changing it",
        "Repair the job's command, dependency invocation or workflow configuration with the smallest change",
        "Run that job on the pull request branch on the same trigger, and attach the passing run and the before and after log excerpts"
      ],
      "excludes": [
        "Expired or missing secrets: we identify what you need to renew or supply; we do not hold your secrets",
        "Third-party outages, GitHub Actions billing problems, storage limits or exhausted quotas",
        "Self-hosted runners we cannot reach through an authorised test route",
        "Flaky tests that fail intermittently rather than a repeatable job failure",
        "An application logic bug that the tests correctly catch; that is a separate bug-fix job",
        "Whole-pipeline redesign, changes to unrelated workflow files or other failing jobs",
        "Deployments, production changes, repository setting changes or widened token permissions"
      ],
      "eligibility": [
        "You can identify the workflow file, job, failed run and trigger; its redacted log shows the repeatable failure",
        "The same job can run on the pull request branch with the same trigger configuration and relevant runner context, without a deployment or new secret",
        "The workflow and its dependencies can be inspected through an agreed company-controlled repository route after scope is agreed",
        "An authorised maintainer on your side can approve the CI run, review the diff and merge the pull request"
      ],
      "stop_conditions": [
        "The cause is an expired or absent secret, an outage, a billing restriction or quota: we explain the evidence and stop rather than try to bypass it",
        "Repeated attempts show an intermittent test, or a real application defect instead of a job configuration failure",
        "The job cannot run on the pull request branch on the same trigger, or running the workflow would deploy or use production secrets",
        "The fix would require inaccessible self-hosted runner changes, unrelated workflow changes or a wider pipeline redesign"
      ],
      "inputs": {
        "initial": [
          "The workflow and job names, failed run identifier or public run link, trigger type and runner label, with no workflow source attached",
          "The first relevant error and surrounding run-log lines, with secrets, source code, private addresses and customer details removed",
          "Whether the same job fails consistently, and whether running it on a branch can trigger a deployment",
          "Do not send credentials, repository code, an access invitation or customer data in the first enquiry"
        ],
        "after_agreement": [
          "The workflow source and necessary dependency files through an authorised company-controlled repository or code-export route, plus a branch route for the pull request",
          "Read access to the named run logs and the failed source revision, using the least access needed",
          "Your written approval for the named branch run and any runner usage, plus who will review and merge; you retain all secret values"
        ]
      },
      "acceptance": [
        {
          "check": "The same named job executes and concludes successfully on the pull request branch on the same trigger, with the agreed runner and matrix configuration; skipped, neutral or ignored failures do not pass.",
          "evidence": "Passing run link and job identifier, source revision and branch, event type, runner configuration and the redacted conclusion log. For a pull_request event, identify its tested merge revision as well as the branch head."
        },
        {
          "check": "The pull request includes before and after run-log excerpts showing the original failure and the successful execution of that job.",
          "evidence": "Attached redacted excerpts labelled with the baseline and repaired run links, job identities and source revisions."
        },
        {
          "check": "No unrelated workflow file is changed, and the agreed job checks and trigger filters have not been skipped, weakened or bypassed.",
          "evidence": "Complete changed-file list and independently reviewed pull-request diff against the agreed baseline."
        },
        {
          "check": "Your authorised maintainer accepts the evidence and merges the repair pull request under the repository's existing rules.",
          "evidence": "Your written sign-off and the merged pull-request record or merge commit identifier."
        }
      ],
      "components": [],
      "part_of": [
        "clear-engineering-backlog",
        "keep-github-actions-ci-green"
      ],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "one-repeatable-job",
          "ask": "Can you name one job that fails consistently on the same trigger?",
          "answers": [
            {
              "label": "Yes, the same job and failure",
              "result": "fit"
            },
            {
              "label": "It passes and fails intermittently",
              "result": "stop"
            },
            {
              "label": "Several jobs fail or I am not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "failure-cause",
          "ask": "Does the log point to a build, command or workflow problem rather than missing access?",
          "answers": [
            {
              "label": "Yes, a repeatable command or configuration error",
              "result": "fit"
            },
            {
              "label": "A secret expired, an outage or quota is named",
              "result": "stop"
            },
            {
              "label": "An application assertion correctly fails",
              "result": "stop"
            },
            {
              "label": "Only an exit code is shown",
              "result": "check"
            }
          ]
        },
        {
          "id": "same-trigger-branch",
          "ask": "Can this same job run on a pull request branch on the same trigger without deploying?",
          "answers": [
            {
              "label": "Yes, with the existing trigger",
              "result": "fit"
            },
            {
              "label": "It runs only on the default branch or deploys",
              "result": "stop"
            },
            {
              "label": "I have not checked",
              "result": "check"
            }
          ]
        },
        {
          "id": "runner-access",
          "ask": "Is the named runner available without sharing production credentials?",
          "answers": [
            {
              "label": "GitHub-hosted or an authorised reachable test runner",
              "result": "fit"
            },
            {
              "label": "The self-hosted runner cannot be reached",
              "result": "stop"
            },
            {
              "label": "I do not know which runner it uses",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "fix-failing-github-actions-job",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/fix-failing-github-actions-job/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=fix-failing-github-actions-job&source=%2Fservices%2Ffix-failing-github-actions-job%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=fix-failing-github-actions-job&body=SI-Outcome%3A%20fix-failing-github-actions-job%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Ffix-failing-github-actions-job%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "fix-one-bug-with-regression-test",
      "url": "https://syntheticindustry.ai/services/fix-one-bug-with-regression-test/",
      "name": "Fix one reproducible bug with a failing-then-passing regression test",
      "summary": "One reproducible bug in one codebase: a regression test fails before the fix and passes after it. You get the repair pull request and both test results to review.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "founder-or-cto",
      "technology": [
        "web-application",
        "automated-tests",
        "git"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — from £295"
      },
      "price": {
        "model": "from",
        "amount": 295,
        "currency": "GBP",
        "period": null,
        "payment": "The agreed fixed repair price is payable only after the regression and agreed checks pass and you sign off. No charge if the bounded investigation cannot reproduce the bug; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off"
      },
      "result": "The agreed reproduction behaves correctly, and its new regression test fails on the unfixed code and passes on the repaired code. You receive one pull request containing the test, the fix and the evidence to review and accept it.",
      "includes": [
        "One described bug in one codebase at an agreed source revision, with one expected result",
        "A bounded reproduction investigation using the agreed reproduction steps, one isolated environment and one synthetic fixture set",
        "Write and run a failing regression test before changing the application behaviour",
        "Make the smallest fix, run the regression and agreed nearby tests, then hand back the pull request with the test evidence"
      ],
      "excludes": [
        "Performance work, profiling, load testing or a speed guarantee",
        "Bugs that need production data, production access or credentials to reproduce",
        "Vague or intermittent reports such as 'it sometimes breaks' without a reliable reproduction",
        "Multiple bugs: each has its own reproduction, agreement and job",
        "Security vulnerabilities that require disclosure or incident handling",
        "A whole-codebase audit, rewrite, CI repair or production deployment"
      ],
      "eligibility": [
        "You can state the expected and actual result for one input or action sequence, with a safe way to repeat it",
        "The relevant source revision can run in isolation with synthetic fixtures and no production credentials",
        "The codebase has a runnable test harness in which this behaviour can be asserted, or a small isolated test can be added without a wider test-suite project",
        "You control the code or have written authority to request a change, and can review and merge the returned pull request"
      ],
      "stop_conditions": [
        "The agreed reproduction checks do not produce the defect in the named environment with the synthetic fixture set",
        "A failing test cannot distinguish the reported defect from unrelated environment or test-harness errors",
        "Reproduction requires production data or credentials, or reveals a security issue needing disclosure handling",
        "The investigation reveals multiple defects or a larger architecture change: we stop and ask whether to quote a different scope"
      ],
      "inputs": {
        "initial": [
          "A plain description of one bug: the actions or inputs, expected result and actual result; use invented values rather than customer examples",
          "The application language and framework versions, affected screen or operation, and whether the defect repeats reliably",
          "Whether a test harness and synthetic reproduction already exist, described without attaching source code",
          "Do not send credentials, code, private repository access, production dumps or customer data in the first enquiry"
        ],
        "after_agreement": [
          "The agreed source revision through a company-controlled repository or code-export route, with a branch route for returning the pull request",
          "Run and test instructions, the agreed reproduction steps and synthetic fixtures that hold no customer information",
          "The written reproduction boundary, expected result, regression and nearby test commands, and the person authorised to accept the repair"
        ]
      },
      "acceptance": [
        {
          "check": "The new regression test fails against the named unfixed revision with the assertion that matches the agreed bug, not an environment or setup failure.",
          "evidence": "The unfixed source revision, regression-test version, command, synthetic fixture description and captured assertion failure."
        },
        {
          "check": "The same regression test passes against the repaired revision, and the original reproduction now produces the expected result with the same synthetic inputs.",
          "evidence": "The repaired source revision and passing output from the same test command, plus the before and after behavioural result."
        },
        {
          "check": "The agreed nearby tests pass, and the pull request contains only this bug's repair, regression test and necessary test support without weakened assertions.",
          "evidence": "Nearby test command results, changed-file list and independently reviewed diff against the agreed baseline."
        }
      ],
      "components": [],
      "part_of": [
        "clear-engineering-backlog",
        "vibe-engineering-lane"
      ],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "repeatable-behaviour",
          "ask": "Can the same steps or inputs reproduce one incorrect result reliably?",
          "answers": [
            {
              "label": "Yes, with a specific expected result",
              "result": "fit"
            },
            {
              "label": "It only breaks sometimes",
              "result": "stop"
            },
            {
              "label": "The steps or expected result are unclear",
              "result": "check"
            }
          ]
        },
        {
          "id": "synthetic-reproduction",
          "ask": "Can the bug be reproduced using invented test data with no production credentials?",
          "answers": [
            {
              "label": "Yes, in an isolated test environment",
              "result": "fit"
            },
            {
              "label": "Only with production data or credentials",
              "result": "stop"
            },
            {
              "label": "We have not tried synthetic inputs",
              "result": "check"
            }
          ]
        },
        {
          "id": "testable-contract",
          "ask": "Can an automated test tell the agreed correct result from the current defect?",
          "answers": [
            {
              "label": "Yes, the result can be asserted",
              "result": "fit"
            },
            {
              "label": "It is only a speed or subjective quality complaint",
              "result": "stop"
            },
            {
              "label": "We do not know if a test harness can run",
              "result": "check"
            }
          ]
        },
        {
          "id": "single-safe-defect",
          "ask": "Is this one ordinary application defect rather than several bugs or a security vulnerability?",
          "answers": [
            {
              "label": "One defect, with no disclosure issue known",
              "result": "fit"
            },
            {
              "label": "Several defects are bundled together",
              "result": "check"
            },
            {
              "label": "It may expose data or enable unauthorised access",
              "result": "stop"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "fix-one-bug-with-regression-test",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/fix-one-bug-with-regression-test/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=fix-one-bug-with-regression-test&source=%2Fservices%2Ffix-one-bug-with-regression-test%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=fix-one-bug-with-regression-test&body=SI-Outcome%3A%20fix-one-bug-with-regression-test%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Ffix-one-bug-with-regression-test%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "hosting-custom-php-site-off-cpanel",
      "url": "https://syntheticindustry.ai/services/hosting-custom-php-site-off-cpanel/",
      "name": "Move a custom PHP site and its database off shared cPanel hosting",
      "summary": "Move your custom PHP site's files and MySQL database to a managed host, test the pages and forms on a preview address, then switch traffic with a way back.",
      "level": "atomic",
      "category": "upgrade",
      "buyer_type": "owner-without-developer",
      "technology": [
        "php",
        "mysql",
        "cpanel",
        "hosting"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £399 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 399,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "After the move, discuss scheduled page, form and backup checks with separately agreed alert handling."
      },
      "result": "Your custom PHP site runs at the new managed host, every agreed page and form works on a preview copy, existing records and uploads are present, and the domain points to the new site after a client-approved switch.",
      "includes": [
        "One custom PHP site with one MySQL database, up to 10 GB of files and a database up to 2 GB",
        "Files, uploads, database and required PHP extensions copied to the new managed host you choose",
        "Configuration adapted to the new host without changing business features",
        "Preview-site tests of agreed pages, logins and forms, and a final sync of database and uploads, with old-site writes paused until old DNS answers expire",
        "A switch and switch-back plan for the domain holder, with live checks after the change",
        "A cutover window long enough to keep writes blocked at the old host until its cached DNS answers stop reaching it; if this is not acceptable, a separate replication plan is needed"
      ],
      "excludes": [
        "WordPress and other CMS sites, or Laravel apps with multiple worker services",
        "Buying or managing the new host account for you",
        "Moving business mailboxes to a new email provider",
        "Rewriting old PHP code to work on a newer version, beyond minor configuration changes",
        "Ongoing hosting administration or security monitoring"
      ],
      "eligibility": [
        "You own the site and have a full file and database backup, or the old host will give you one",
        "The new host supports the PHP version and extensions your site needs, or the site is already tested on its PHP version",
        "You or a trusted holder can create the new hosting account and change the domain's DNS",
        "You can name the pages and forms that must work, and can agree a short pause on writes for the final sync",
        "You can keep the old host running through the DNS cache window, with its forms and other writes blocked after the final sync",
        "If old mailboxes are on the departing host, you have a confirmed continuing mail plan or a separately completed mailbox move"
      ],
      "stop_conditions": [
        "No safe backup of the old site's files and database is available",
        "The site takes card numbers directly or stores regulated data that needs a specialised migration route",
        "The new host cannot run a library, PHP version or database the site needs and no small compatibility fix exists",
        "There can be no pause on new writes and records must never be lost: that needs a live replication plan quoted separately",
        "Bookings or orders cannot be paused while old DNS answers remain cached, and no separately agreed replication plan exists",
        "The old host will close mailboxes before email is moved or confirmed to stay active elsewhere"
      ],
      "inputs": {
        "initial": [
          "Your site's address and the names of the old and proposed new hosts",
          "The current PHP and MySQL versions if your control panel shows them",
          "Approximate size of the site backup and database, if known",
          "The pages and forms that matter to the business",
          "Whether logins, uploads, bookings or orders change the database during the day"
        ],
        "after_agreement": [
          "A full backup of site files and database, shared through a client-controlled route",
          "A test environment at the new host and a non-production test login if the site has logins",
          "An authorised domain holder available to apply the switch and switch-back steps",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "On the preview address, each agreed page and form works, the login accepts a test user, and the PHP error log shows no new fatal error",
          "evidence": "Screenshots, form confirmation and a redacted error-log excerpt"
        },
        {
          "check": "The destination database has the same table counts and the newest agreed test record as the source after the final sync",
          "evidence": "Before and after row-count and newest-record comparison"
        },
        {
          "check": "After the domain holder switches DNS, the public site loads over https, an agreed form reaches the inbox, and MX records still point to the same mail provider",
          "evidence": "Status checks, test enquiry and public DNS lookup"
        },
        {
          "check": "After the final sync, the destination has the newest agreed database record and uploaded file, while the old site’s write paths remain blocked until its DNS cache window ends",
          "evidence": "Timestamped before/after record and file hashes, old-site maintenance screenshot and DNS TTL notes"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "site-type",
          "ask": "What is the site built with?",
          "answers": [
            {
              "label": "Custom PHP and MySQL",
              "result": "fit"
            },
            {
              "label": "WordPress or another CMS",
              "result": "stop"
            },
            {
              "label": "Laravel with queues or workers",
              "result": "check"
            }
          ]
        },
        {
          "id": "backup",
          "ask": "Can the old host give you a full backup of the site's files and database?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "new-host",
          "ask": "Have you chosen and opened an account with the new host?",
          "answers": [
            {
              "label": "Yes, managed hosting that supports PHP",
              "result": "fit"
            },
            {
              "label": "Not yet",
              "result": "check"
            },
            {
              "label": "A server I must administer myself",
              "result": "stop"
            }
          ]
        },
        {
          "id": "changing-data",
          "ask": "Do visitors create accounts, orders or bookings that change the database?",
          "answers": [
            {
              "label": "No, mostly contact forms",
              "result": "fit"
            },
            {
              "label": "Yes, we can pause writes until old DNS caches clear",
              "result": "fit"
            },
            {
              "label": "Yes, but only for a short switch",
              "result": "check"
            },
            {
              "label": "Yes, and we cannot pause them",
              "result": "stop"
            }
          ]
        },
        {
          "id": "mailboxes",
          "ask": "Does the old hosting account also hold your business email mailboxes?",
          "answers": [
            {
              "label": "No, email is elsewhere",
              "result": "fit"
            },
            {
              "label": "Yes, and the old host is closing",
              "result": "stop"
            },
            {
              "label": "Yes, and the host will keep mail active",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "hosting-custom-php-site-off-cpanel",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/hosting-custom-php-site-off-cpanel/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=hosting-custom-php-site-off-cpanel&source=%2Fservices%2Fhosting-custom-php-site-off-cpanel%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=hosting-custom-php-site-off-cpanel&body=SI-Outcome%3A%20hosting-custom-php-site-off-cpanel%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fhosting-custom-php-site-off-cpanel%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "hosting-disk-full-website-down",
      "url": "https://syntheticindustry.ai/services/hosting-disk-full-website-down/",
      "name": "Bring back a website after its hosting server runs out of disk space",
      "summary": "Find what filled one hosting server, restore enough space safely, and set a disk alert and retention rule so the website is not stranded again.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "hosting",
        "linux",
        "mysql"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — from £195"
      },
      "price": {
        "model": "from",
        "amount": 195,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If storage keeps growing, discuss recurring capacity checks and retention review. This repair does not include an on-call service."
      },
      "result": "The site and database start normally, an agreed minimum free-space threshold is restored without deleting unique data, and a disk alert warns the owner before it fills again.",
      "includes": [
        "One managed Linux VPS or hosting account and its main filesystem",
        "Read-only inventory of the largest directories and recent growth",
        "A client-approved cleanup limited to disposable logs, cache or duplicate backups after a safe off-site copy",
        "One retention rule for the offending files and a disk usage alert"
      ],
      "excludes": [
        "Replacing a failing physical disk or increasing hosting capacity",
        "Deleting customer uploads, the only backup, database files or mailboxes",
        "Investigating a suspected intrusion or ransomware event",
        "Ongoing server administration or monthly monitoring"
      ],
      "eligibility": [
        "You own or are authorised to manage the hosting account",
        "Your managed host can take a snapshot and help restore services",
        "The full filesystem has identifiable disposable data or the plan can add capacity",
        "A site holder can approve exactly which files or folders may be removed"
      ],
      "stop_conditions": [
        "Disk errors or hardware failure show up in the host’s diagnostics",
        "The only large files are unique customer data or the sole backup",
        "Signs of intrusion or ransomware are present",
        "No current snapshot or verified backup exists and deleting files would be irreversible"
      ],
      "inputs": {
        "initial": [
          "The site address, host and exact disk warning or screenshot",
          "When the site or database first stopped",
          "The disk capacity and free space shown in the host panel",
          "Whether you have a current snapshot or off-site backup"
        ],
        "after_agreement": [
          "A read-only disk usage report from the host or a scoped host technician",
          "A snapshot confirmation and explicit approval of each deletion",
          "An address to receive the disk alert",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "After the approved cleanup, the main filesystem has at least the agreed free-space amount and stays above it during one day of normal use",
          "evidence": "Disk usage screenshots immediately after and next day"
        },
        {
          "check": "The agreed site pages load and a test record can be read and saved to the database",
          "evidence": "Status checks and one test record"
        },
        {
          "check": "A deliberately lowered alert threshold sends a test warning to the owner address",
          "evidence": "Alert email and settings screenshot"
        },
        {
          "check": "The retention rule removes only an old synthetic log or cache file, not uploads or database files",
          "evidence": "Dry-run or isolated test output and the reviewer’s file list"
        },
        {
          "check": "A database engine check on a fresh host snapshot reports no new table or file errors after the full-disk incident; if it cannot run safely, data integrity remains unverified and the job stops for a recovery plan",
          "evidence": "Engine-specific consistency check or host report from the snapshot, with any errors redacted; one successful test write is not an integrity proof"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "warning",
          "ask": "What does the host report?",
          "answers": [
            {
              "label": "Disk or storage full",
              "result": "fit"
            },
            {
              "label": "Server is down but no disk warning",
              "result": "check"
            }
          ]
        },
        {
          "id": "backup",
          "ask": "Do you have a snapshot or off-site backup from before this started?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "check"
            }
          ]
        },
        {
          "id": "files",
          "ask": "What seems to be growing?",
          "answers": [
            {
              "label": "Logs, cache or old backups",
              "result": "fit"
            },
            {
              "label": "Only customer uploads or mailboxes",
              "result": "stop"
            }
          ]
        },
        {
          "id": "host",
          "ask": "Can your host take a snapshot and apply an approved cleanup?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, it is an unmanaged server",
              "result": "stop"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "hosting-disk-full-website-down",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/hosting-disk-full-website-down/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=hosting-disk-full-website-down&source=%2Fservices%2Fhosting-disk-full-website-down%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=hosting-disk-full-website-down&body=SI-Outcome%3A%20hosting-disk-full-website-down%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fhosting-disk-full-website-down%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "hosting-offsite-backups-with-restore-test",
      "url": "https://syntheticindustry.ai/services/hosting-offsite-backups-with-restore-test/",
      "name": "Set up off-site backups for a website and prove a restore works",
      "summary": "Back up one site and its database to a storage account you own, then restore a copy on staging and test pages and a record before signing off.",
      "level": "atomic",
      "category": "integrate",
      "buyer_type": "owner-without-developer",
      "technology": [
        "hosting",
        "backup",
        "mysql"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £295 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 295,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "Discuss scheduled restore rehearsals and review of failed-backup alerts if you need someone to keep checking that recovery works."
      },
      "result": "A scheduled off-site copy of the site files and database lands in storage you own, and a sampled restore on staging shows the agreed pages and a named test record still work.",
      "includes": [
        "One website with up to 10 GB of files and one database up to 2 GB",
        "A daily schedule to an off-site account you own, with the retention setting configured for at least 14 days of copies",
        "Encrypted transport and storage with scoped access and a documented key holder",
        "One full restore into a non-public staging location and tests of agreed pages and a database record",
        "One tested alert when a daily backup fails"
      ],
      "excludes": [
        "Guaranteeing that the host or storage provider will never fail",
        "Backing up mailboxes or other separate applications",
        "An ongoing paid backup-monitoring service",
        "Making a broken site or database healthy as part of a restore"
      ],
      "eligibility": [
        "You control the site, database and an off-site storage account or will create one",
        "The host permits scheduled exports or an approved backup tool",
        "A separate staging location can run a restore without touching live data",
        "Someone at your business can receive alerts and hold recovery keys"
      ],
      "stop_conditions": [
        "The host will not provide a complete database export or any permitted backup method",
        "A staging restore would expose unredacted sensitive customer data to unauthorised people",
        "The only backup is on an infected or compromised server and its integrity cannot be trusted",
        "The source is already corrupted and no known-good copy exists: repair is a separate job"
      ],
      "inputs": {
        "initial": [
          "The host and platform your site uses",
          "Size of the site files and database, if the panel shows it",
          "Current backup method and where its copies are stored",
          "How much data you can afford to lose in an outage: one day or less"
        ],
        "after_agreement": [
          "A backup export made by your host and a staging environment in your account",
          "A storage account with a narrowly scoped destination and a key you hold",
          "One synthetic test record to look for after restore",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "The first scheduled backup contains both files and database in the client-owned off-site account, with a visible timestamp and expected size",
          "evidence": "Storage listing and backup log"
        },
        {
          "check": "A separate staging environment restored from that archive loads each agreed page and the named test database record",
          "evidence": "Restore log, screenshots and test record"
        },
        {
          "check": "A simulated failed backup sends an alert to the owner address, and the next successful run clears it",
          "evidence": "Failure and recovery alerts"
        },
        {
          "check": "The documented restore steps work from a new isolated environment without access to the live server",
          "evidence": "Second reviewer’s rerun note and log"
        },
        {
          "check": "The backup destination shows a retention setting of at least 14 daily copies, and transport and stored archives use the agreed encryption settings with recovery keys held by the client",
          "evidence": "Screenshots or exported settings for retention, transport encryption, archive encryption and client-held key location; not a claim that 14 days have elapsed"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "location",
          "ask": "Where are backups kept now?",
          "answers": [
            {
              "label": "Only at the website host",
              "result": "fit"
            },
            {
              "label": "Off-site, but never restored",
              "result": "fit"
            },
            {
              "label": "Nowhere",
              "result": "fit"
            }
          ]
        },
        {
          "id": "database",
          "ask": "Does the site store bookings, orders, members or form entries in a database?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, files only",
              "result": "fit"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "access",
          "ask": "Can your host export the files and database on a schedule?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "sensitive",
          "ask": "Does the backup include regulated or unusually sensitive personal data?",
          "answers": [
            {
              "label": "No, ordinary site records",
              "result": "fit"
            },
            {
              "label": "Yes",
              "result": "stop"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "hosting-offsite-backups-with-restore-test",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/hosting-offsite-backups-with-restore-test/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=hosting-offsite-backups-with-restore-test&source=%2Fservices%2Fhosting-offsite-backups-with-restore-test%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=hosting-offsite-backups-with-restore-test&body=SI-Outcome%3A%20hosting-offsite-backups-with-restore-test%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fhosting-offsite-backups-with-restore-test%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "keep-github-actions-ci-green",
      "url": "https://syntheticindustry.ai/services/keep-github-actions-ci-green/",
      "name": "Keep your GitHub Actions CI green, month after month",
      "summary": "We watch the workflows you name. When one fails on your default branch we investigate it and open a fix pull request, or tell you what only you can change.",
      "level": "standing",
      "category": "engineering",
      "buyer_type": "founder-or-cto",
      "technology": [
        "github-actions",
        "github"
      ],
      "version": "2026-10-10",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Start this service"
      },
      "price": {
        "model": "fixed",
        "amount": 295,
        "currency": "GBP",
        "period": "month",
        "payment": "Billing is monthly under the written terms we agree with you. Nothing is charged until you have agreed them.",
        "tested": false
      },
      "term": {
        "kind": "recurring",
        "period": "month",
        "cancellation": "End it at the end of any month by telling us in writing. Open pull requests are finished or handed back.",
        "refund": "Terms for cancelling and for refunds are written down before you agree to start."
      },
      "result": "The workflows you name stay passing on your default branch. Each failure is investigated and either fixed in a pull request or explained, and each month you see what failed and how it ended.",
      "includes": [
        "Monitoring of the named workflows on one repository's default branch",
        "Investigation and a fix pull request for each failure we can fix, up to the agreed number each month",
        "A plain explanation, with evidence, when the cause is outside the repository",
        "A written monthly summary of failures seen and how each ended"
      ],
      "excludes": [
        "Merging to your default branch, which stays with your team",
        "Changing secrets, runners, permissions or billing",
        "Fixing application bugs that the tests correctly report; those are separate jobs",
        "Redesigning your pipeline or moving it to another CI system",
        "Out-of-hours cover or any guaranteed response time"
      ],
      "eligibility": [
        "Your CI runs on GitHub Actions and the workflows are in the repository",
        "You can create a read-only token for run results, and invite us to a fork or branch we can open pull requests from",
        "A person on your side reviews and merges pull requests"
      ],
      "stop_conditions": [
        "The workflows can only run with production secrets we would have to hold",
        "Most failures are caused by something outside the repository that you cannot or will not fix",
        "Failures regularly exceed the agreed monthly number, so we agree a different scope with you"
      ],
      "inputs": {
        "initial": [
          "The repository link and the names of the workflows you want kept green",
          "How often they usually fail, as best you know",
          "Who reviews and merges pull requests"
        ],
        "after_agreement": [
          "A read-only token or app installation limited to workflow run results",
          "Access to a fork or branch we can open pull requests from",
          "The agreed number of fixes a month and who to tell when something is outside the repository"
        ]
      },
      "acceptance": [
        {
          "check": "For each fix, the failing job passes on the pull request branch on the same trigger.",
          "evidence": "Links to the passing run and the before and after log excerpts."
        },
        {
          "check": "No workflow file or setting outside the failing job is changed.",
          "evidence": "The pull request diff, limited to the files named in the pull request description."
        },
        {
          "check": "Each month's summary lists every failure seen on the named workflows and how it ended.",
          "evidence": "The written monthly summary, which you can compare with your own run history."
        }
      ],
      "components": [
        {
          "outcome": "fix-failing-github-actions-job",
          "role": "on_trigger",
          "contributes": "counts",
          "needs": []
        }
      ],
      "part_of": [
        "vibe-engineering-lane"
      ],
      "completion": {
        "rule": "continuous",
        "text": "This service is never finished. Each month's summary shows whether the workflows stayed green, and it continues until you end it."
      },
      "responsibility": {
        "holds_true": [
          "The workflows you name pass on your default branch",
          "Every failure there is investigated and ends in a fix pull request or an explanation"
        ],
        "sources": [
          "Run results for the named workflows on the default branch, read through a read-only token you create",
          "GitHub's own failed-run notifications for those workflows"
        ],
        "triggers": [
          {
            "when": "A named workflow fails on the default branch.",
            "response": "We read the run log, reproduce the failure on a branch and open a pull request that fixes it, or tell you what you need to change.",
            "outcome": "fix-failing-github-actions-job"
          },
          {
            "when": "The same workflow fails again and again with no change to the code.",
            "response": "We mark it as flaky, show you the evidence, and propose a fix or a quarantine that you approve.",
            "outcome": null
          },
          {
            "when": "A month ends.",
            "response": "We send a short written summary: failures seen, pull requests opened, and what is still open.",
            "outcome": null
          }
        ],
        "hours": "Hours are agreed in writing before the service starts. At launch the service is not staffed round the clock, so we do not offer round-the-clock cover.",
        "service_level": "No response-time guarantee is published for this new service. A target is agreed in writing before it starts, set to what a service at this stage can actually keep.",
        "escalate_when": [
          "The cause is outside the repository, such as an expired secret or an outside outage",
          "A fix would change what your product does, not only how it is built",
          "Failures pass the agreed monthly number"
        ]
      },
      "evidence_delivered": null,
      "eligibility_check": null,
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "keep-github-actions-ci-green",
          "SI-Mode": "subscribe",
          "SI-Page": "https://syntheticindustry.ai/services/keep-github-actions-ci-green/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=keep-github-actions-ci-green&source=%2Fservices%2Fkeep-github-actions-ci-green%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=keep-github-actions-ci-green&body=SI-Outcome%3A%20keep-github-actions-ci-green%0ASI-Mode%3A%20subscribe%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fkeep-github-actions-ci-green%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "subscribe"
      }
    },
    {
      "id": "laravel-old-app-to-supported-version",
      "url": "https://syntheticindustry.ai/services/laravel-old-app-to-supported-version/",
      "name": "Upgrade one Laravel 6–10 app with its key business flows tested",
      "summary": "Upgrade a Laravel 6–10 app to a currently supported version on staging. Inventory every route and job, then deeply test five agreed business flows before the client-controlled release.",
      "level": "atomic",
      "category": "upgrade",
      "buyer_type": "owner-without-developer",
      "technology": [
        "laravel",
        "php",
        "mysql"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — from £1,495"
      },
      "price": {
        "model": "from",
        "amount": 1495,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "Discuss a maintenance arrangement that keeps dependencies supported and reruns your key flows after changes."
      },
      "result": "A Laravel app on a supported version passes a route and job inventory on staging, and up to five named business flows pass detailed checks. The owner sees any untested paths and accepts the remaining risk before a live release.",
      "includes": [
        "One Laravel 6–10 app with one database, up to five named critical flows and a manageable route/job inventory",
        "An inventory of every production route, command, scheduled task and queued job from source and host configuration",
        "A staged framework and PHP upgrade path, including package compatibility decisions",
        "A staging smoke check of every inventoried route and job without real customer mail or payment, and deep before/after tests of the five critical flows",
        "A release decision sheet naming any path or integration that could not be tested"
      ],
      "excludes": [
        "New features, redesign or a database re-platform",
        "A Laravel 5 or older app, which needs a separate code and data assessment",
        "Deploying to production under your account or managing live credentials",
        "Rewriting an abandoned third-party package if no supported alternative exists"
      ],
      "eligibility": [
        "The app is Laravel 6–10 and its source code and composer lockfile are available",
        "You can name up to five workflows the business needs and can provide a test account",
        "A safe copy of the app and database can run without live payments or customer email",
        "Your site holder can approve and carry out a live deployment",
        "Every production route and background process can be inventoried, or the remaining uncertainty is accepted in writing before any deployment"
      ],
      "stop_conditions": [
        "The code or its dependencies are encoded or cannot legally be changed",
        "A required package has no compatible release or alternative and needs a large rewrite",
        "There is no safe way to test a copy without real payment cards or regulated data",
        "The database migration cannot be reversed or rehearsed without a separate data plan",
        "A critical production route, job or integration cannot be checked on staging and the owner will not accept that explicit risk",
        "The business cannot pause writes for cutover and has no tested way to reconcile records if a rollback is needed"
      ],
      "inputs": {
        "initial": [
          "The current Laravel and PHP versions, if known",
          "A redacted copy of the composer package list, not secrets or application code in the first email",
          "The five most important business workflows and what breaks now",
          "Who holds the code and hosting accounts"
        ],
        "after_agreement": [
          "A controlled copy of the source and composer.lock, with secrets removed",
          "A sanitised database snapshot or fixture and a test account",
          "The site’s holder available to review the staged result and deployment steps",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "The target app installs with its lockfile on the agreed supported PHP version, and the test command finishes without failures",
          "evidence": "Dependency and test logs from the isolated copy"
        },
        {
          "check": "Every inventoried route loads or returns its documented expected status on staging; the five named critical workflows complete without new fatal errors",
          "evidence": "Route inventory with status per route, plus screenshots and redacted test records for the five deep flows"
        },
        {
          "check": "Every inventoried scheduled command and queue job has a staging smoke result; each named critical job runs once without sending customer mail",
          "evidence": "Job inventory, smoke result and captured mail for critical jobs; any untestable job is named as a release risk"
        },
        {
          "check": "The rollback steps restore the old application and database snapshot in a test restore",
          "evidence": "Before/after restore result"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "version",
          "ask": "Which Laravel version does the app use?",
          "answers": [
            {
              "label": "6–10",
              "result": "fit"
            },
            {
              "label": "5 or older",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "code",
          "ask": "Can you get the source code and composer.lock?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            }
          ]
        },
        {
          "id": "copy",
          "ask": "Can a safe copy run without real customers or payment cards?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "flows",
          "ask": "Can you name the business workflows you need kept working?",
          "answers": [
            {
              "label": "Yes, five or fewer",
              "result": "fit"
            },
            {
              "label": "No, I do not know what the app does",
              "result": "check"
            }
          ]
        },
        {
          "id": "holder",
          "ask": "Who can deploy the tested change?",
          "answers": [
            {
              "label": "Our host or a site holder",
              "result": "fit"
            },
            {
              "label": "Nobody yet",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "laravel-old-app-to-supported-version",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/laravel-old-app-to-supported-version/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=laravel-old-app-to-supported-version&source=%2Fservices%2Flaravel-old-app-to-supported-version%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=laravel-old-app-to-supported-version&body=SI-Outcome%3A%20laravel-old-app-to-supported-version%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Flaravel-old-app-to-supported-version%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "laravel-queue-emails-stopped-sending",
      "url": "https://syntheticindustry.ai/services/laravel-queue-emails-stopped-sending/",
      "name": "Restart a Laravel job queue that stopped sending business emails",
      "summary": "Find why a Laravel queue stopped processing one named email or notification job, repair it on staging, and add a failed-job alert.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "laravel",
        "php",
        "queue"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £195 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 195,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If the queue is business-critical, discuss monitoring job health and investigating failures within agreed hours and escalation rules."
      },
      "result": "The named email or notification job completes once on a staging copy after it is queued, failed jobs are visible, and an alert reaches the owner if processing stops again.",
      "includes": [
        "One Laravel app and one named email or notification job type",
        "Reproduce queued-but-not-processed jobs on staging with captured outgoing mail",
        "Repair one worker configuration or one reproducible job exception",
        "Add a queue health check or failed-job alert to an address you own"
      ],
      "excludes": [
        "Fixing mailbox SPF/DKIM/DMARC or spam placement after a job successfully sends",
        "Rebuilding the app’s full queue architecture or changing queue providers",
        "Bulk replay of past failed jobs without customer-approved deduplication",
        "Production deployment under your credentials"
      ],
      "eligibility": [
        "The app is Laravel and uses a queue connection other than sync for the named job",
        "Your site holder can supply a staging copy and the worker configuration without live secrets",
        "You can give an example of one missing message and the event that should have triggered it",
        "Someone can apply the worker restart and alert settings to production",
        "A safe test event creates the named queued or failed job, or the worker log directly shows that the job is waiting"
      ],
      "stop_conditions": [
        "No reproducible triggering event or queue logs can be obtained",
        "A payment, legal notice or other irreversible job cannot be tested safely with fake data",
        "The underlying mail service is rejecting successfully sent messages; that needs the mail authentication job",
        "The failed-job backlog must be replayed without a way to prevent duplicate invoices or messages",
        "The event does not enqueue the named job; the problem is upstream of the queue",
        "There is a backlog of old jobs and no client-approved list of what may be sent after the worker restarts"
      ],
      "inputs": {
        "initial": [
          "What message is missing and what event should have sent it",
          "When it last worked and what changed, such as a deploy or host move",
          "Any failed-job or queue error with private details removed",
          "Who controls the server and can restart the worker"
        ],
        "after_agreement": [
          "A controlled staging copy, a test login and sanitised queue data",
          "A redacted worker config and relevant logs, never production passwords",
          "An alert destination you own and a site holder for production changes",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "A test event queues one named job on staging and the worker processes it exactly once",
          "evidence": "Job ID, queue log and captured test message"
        },
        {
          "check": "With the worker stopped on staging, the health check sends a test alert to the owner address",
          "evidence": "Alert email and check log"
        },
        {
          "check": "A deliberately failing test job appears in failed jobs with a useful error, and the normal job still processes afterwards",
          "evidence": "Redacted failed-job entry and next successful job ID"
        },
        {
          "check": "After your site holder deploys and restarts workers, a controlled live test creates exactly one expected message",
          "evidence": "Owner-held mailbox screenshot and redacted queue log"
        },
        {
          "check": "Before a live restart, the pending-job inventory is dated and any unapproved historic email or invoice job is quarantined; one newly queued test job still runs exactly once",
          "evidence": "Redacted backlog inventory, owner approval or quarantine record, and new test job ID"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "framework",
          "ask": "Is the app built with Laravel?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No or not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "symptom",
          "ask": "What stopped working?",
          "answers": [
            {
              "label": "An automatic email job is visibly waiting in the queue",
              "result": "fit"
            },
            {
              "label": "One automatic message is missing",
              "result": "check"
            },
            {
              "label": "Every email, including hand-written mailbox messages",
              "result": "stop"
            },
            {
              "label": "Many unrelated background processes",
              "result": "check"
            }
          ]
        },
        {
          "id": "staging",
          "ask": "Can a test booking or order be made without real charges or customers?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            }
          ]
        },
        {
          "id": "logs",
          "ask": "Can the site holder see queue or failed-job logs?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "check"
            }
          ]
        },
        {
          "id": "job-visible",
          "ask": "Does a test event create a queued or failed job?",
          "answers": [
            {
              "label": "Yes, I can see the named job waiting or failing",
              "result": "fit"
            },
            {
              "label": "No job appears",
              "result": "stop"
            },
            {
              "label": "I cannot see the queue",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "laravel-queue-emails-stopped-sending",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/laravel-queue-emails-stopped-sending/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=laravel-queue-emails-stopped-sending&source=%2Fservices%2Flaravel-queue-emails-stopped-sending%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=laravel-queue-emails-stopped-sending&body=SI-Outcome%3A%20laravel-queue-emails-stopped-sending%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Flaravel-queue-emails-stopped-sending%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "nextjs-vercel-build-fails",
      "url": "https://syntheticindustry.ai/services/nextjs-vercel-build-fails/",
      "name": "Fix a Next.js build that works locally but fails on Vercel",
      "summary": "The same commit builds on a Vercel preview and its named page loads there without introducing a secret into source control.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "nextjs",
        "vercel"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £149 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 149,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If deployments break repeatedly, discuss keeping the build checked against dependency and environment changes."
      },
      "result": "The same commit builds on a Vercel preview and its named page loads there without introducing a secret into source control.",
      "includes": [
        "Diagnose one failing deployment for an existing Next.js repo",
        "Fix the smallest code or Vercel project-setting mismatch and rerun the build"
      ],
      "excludes": [
        "A redesign or new feature",
        "Migrating to another host",
        "Repairing a production database or third-party outage",
        "Guaranteed performance or a whole-app security audit"
      ],
      "eligibility": [
        "A reproducible failed Vercel deployment and the matching source commit exist",
        "Owner can create a Vercel preview and change project settings"
      ],
      "stop_conditions": [
        "The error only occurs after runtime login with real customer data",
        "The repo is incomplete or third-party access/paid service is blocked"
      ],
      "inputs": {
        "initial": [
          "Redacted build error, framework preset and failing commit",
          "Whether local production build succeeds, not only dev mode"
        ],
        "after_agreement": [
          "Client-controlled code export or company-owned read-only repo route",
          "Preview project and owner-entered test environment variables",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "Vercel preview for the agreed commit reports a successful production build and the named route renders expected content",
          "evidence": "Deployment URL, commit ID and redacted build log"
        },
        {
          "check": "Local production build still passes and the repo diff contains no environment values or credentials",
          "evidence": "Command exit and reviewed diff"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "does-npm-run-build-or-your-documented-production-build-pass-locally",
          "ask": "Does npm run build or your documented production build pass locally?",
          "answers": [
            {
              "label": "Yes, only cloud fails",
              "result": "fit"
            },
            {
              "label": "No, local build fails too",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "is-the-failure-during-build-rather-than-after-a-successful-deploy",
          "ask": "Is the failure during build rather than after a successful deploy?",
          "answers": [
            {
              "label": "Build fails",
              "result": "fit"
            },
            {
              "label": "Build passes but the live page errors",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-share-a-failed-vercel-build-log-with-tokens-removed",
          "ask": "Can you share a failed Vercel build log with tokens removed?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No build log exists",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "nextjs-vercel-build-fails",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/nextjs-vercel-build-fails/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=nextjs-vercel-build-fails&source=%2Fservices%2Fnextjs-vercel-build-fails%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=nextjs-vercel-build-fails&body=SI-Outcome%3A%20nextjs-vercel-build-fails%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fnextjs-vercel-build-fails%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "operate-software-engineering",
      "url": "https://syntheticindustry.ai/services/operate-software-engineering/",
      "name": "Operate software engineering for your company",
      "summary": "Hand us a broad engineering responsibility under governance you set. This is exploratory: we talk first about whether it could work, before anything is proposed.",
      "level": "function",
      "category": "engineering",
      "buyer_type": "founder-or-cto",
      "technology": [
        "web-applications",
        "github"
      ],
      "version": "2026-10-10",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Discuss this function"
      },
      "price": {
        "model": "quote",
        "amount": null,
        "currency": "USD",
        "period": null,
        "payment": "Terms are set in the written proposal. Nothing is charged until you have agreed them.",
        "tested": false
      },
      "term": {
        "kind": "quoted",
        "cancellation": "How and when either side can end it is written into the governance agreement before you agree to anything."
      },
      "result": "A broad engineering responsibility transfers to us under agreed governance and authority. You keep the decisions that are yours, and we are accountable for the agreed work being delivered, verified and kept in good order.",
      "includes": [
        "A written governance agreement: what we own, what stays with you, and who approves what",
        "Engineering delivered through the engineering lane and the smaller outcomes it uses",
        "Intake, ordering and tracking of requests, with regular written reporting",
        "A review of how the arrangement is working, and a decision to continue, change or stop"
      ],
      "excludes": [
        "Anything not written into the governance agreement",
        "Unsupervised access to production systems, or authority over spending, hiring or contracts on your behalf",
        "Legal, security-certification or compliance sign-off",
        "A guarantee of outcomes before we have agreed what the function covers"
      ],
      "eligibility": [
        "You have a real product and a leader who can set the governance and approve what it says",
        "The product can be worked on in isolation, with approvals that you are able to give",
        "You are willing to begin with an engineering lane before widening the scope"
      ],
      "stop_conditions": [
        "The function cannot be bounded in a written agreement",
        "The work needs authority or access that you cannot grant",
        "The arrangement would need us to accept a liability that we have not agreed to"
      ],
      "inputs": {
        "initial": [
          "What the company does and what its engineering needs to cover, in a few paragraphs",
          "How engineering is handled today, and what is not working",
          "Who on your side would set the governance and approve the work"
        ],
        "after_agreement": [
          "Access and environments, granted in stages as the governance agreement allows",
          "A named decision maker and a named day-to-day contact",
          "The measures by which you will judge whether it is working"
        ]
      },
      "acceptance": [
        {
          "check": "A written governance agreement exists and you have approved it before any work beyond the lane starts.",
          "evidence": "The signed agreement and its scope statement."
        },
        {
          "check": "Each delivered change meets its agreed checks and carries its evidence.",
          "evidence": "The delivery evidence packet for each change."
        },
        {
          "check": "At each periodic review, the arrangement is judged against the measures you set.",
          "evidence": "The written review and your decision to continue, change or stop."
        }
      ],
      "components": [
        {
          "outcome": "vibe-engineering-lane",
          "role": "included",
          "contributes": "required",
          "needs": []
        },
        {
          "outcome": "clear-engineering-backlog",
          "role": "optional",
          "contributes": "informational",
          "needs": []
        }
      ],
      "part_of": [],
      "completion": {
        "rule": "continuous",
        "text": "There is no finish line. The periodic review of the arrangement against the measures you set decides whether it continues, changes or stops."
      },
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": null,
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "operate-software-engineering",
          "SI-Mode": "discuss",
          "SI-Page": "https://syntheticindustry.ai/services/operate-software-engineering/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=operate-software-engineering&source=%2Fservices%2Foperate-software-engineering%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=operate-software-engineering&body=SI-Outcome%3A%20operate-software-engineering%0ASI-Mode%3A%20discuss%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Foperate-software-engineering%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "discuss"
      }
    },
    {
      "id": "php-7-site-to-php-8",
      "url": "https://syntheticindustry.ai/services/php-7-site-to-php-8/",
      "name": "Keep an old PHP website running when your host moves it to PHP 8",
      "summary": "Make a custom PHP 7 website that nobody maintains run on PHP 8.3 or newer, tested page by page and form by form on a copy before your host switches.",
      "level": "atomic",
      "category": "upgrade",
      "buyer_type": "owner-without-developer",
      "technology": [
        "php",
        "mysql"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Ask for a fixed price"
      },
      "price": {
        "model": "quote",
        "amount": null,
        "currency": "GBP",
        "period": null,
        "payment": "After every agreed page and form works on the test copy and you sign off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "Discuss scheduled runtime compatibility checks before your host changes PHP again."
      },
      "result": "Your site's own code runs on PHP 8.3 or newer: every page and form on the agreed list works on a test copy as it did before, and your host can switch the live site with a tested way back.",
      "includes": [
        "Making the site's own PHP code run on the target version your host offers, 8.3 or newer",
        "Replacing functions PHP 8 removed and fixing code that newer PHP treats as an error",
        "Updating libraries bundled inside the site where a PHP 8 version exists",
        "Testing each agreed page and form on a copy running the target version"
      ],
      "excludes": [
        "WordPress, Joomla, Drupal or other CMS sites",
        "PHP 5 sites that still use the old mysql database functions",
        "Redesign, new features or a rewrite in a modern framework",
        "Moving the site to another host",
        "Ongoing maintenance or security monitoring"
      ],
      "eligibility": [
        "The site is custom PHP or an old framework, not a CMS such as WordPress",
        "It runs on PHP 7.0 to 7.4 today, or did until the host switched it",
        "Your host can give you a full copy of the site's files and database",
        "You can name the pages and forms the business relies on"
      ],
      "stop_conditions": [
        "The site still uses PHP 5's mysql functions: that needs its database code rewritten, quoted separately",
        "Parts of the code are encoded (ionCube or Zend Guard) and have no PHP 8 version",
        "The site handles card numbers itself instead of sending customers to a payment provider",
        "No copy of the files and database can be made"
      ],
      "inputs": {
        "initial": [
          "The site's address",
          "The PHP version it runs now and the one your host wants, with the host's email if they sent one",
          "Any error message or screenshot, with personal details removed",
          "The pages and forms that matter most, such as contact, booking or a members' login",
          "Who built the site and roughly when, if you know"
        ],
        "after_agreement": [
          "A secret-free source copy and sanitised database fixture through the agreed company-controlled secure handoff",
          "A test login, if the site has logins",
          "Your host's staging or a test subdomain, if they offer one",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "On a copy running the target PHP version, every agreed page returns HTTP 200 and shows the same content as on the old version",
          "evidence": "Status and screenshot per page, old and new side by side"
        },
        {
          "check": "Each agreed form submits with test data and does what it did before: sends its email or saves its record",
          "evidence": "Captured email or database row per form"
        },
        {
          "check": "The PHP error log shows no fatal errors and no new warnings for the agreed pages during the test run",
          "evidence": "Log excerpt for the test window"
        },
        {
          "check": "After your host switches the live site, the same pages return HTTP 200",
          "evidence": "Your check, or a status check we run on the public pages"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "what-runs",
          "ask": "What is the site built with?",
          "answers": [
            {
              "label": "Custom PHP or an old framework",
              "result": "fit"
            },
            {
              "label": "WordPress",
              "result": "stop"
            },
            {
              "label": "A site builder such as Wix or Squarespace",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "php-now",
          "ask": "Which PHP version does the site run on now?",
          "answers": [
            {
              "label": "7.x",
              "result": "fit"
            },
            {
              "label": "5.x",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "broken-yet",
          "ask": "Has the site already broken, or has your host given a date?",
          "answers": [
            {
              "label": "Already broken",
              "result": "fit"
            },
            {
              "label": "The host has given a date",
              "result": "fit"
            }
          ]
        },
        {
          "id": "copy",
          "ask": "Can your host give you a full copy of the site's files and database?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "cards",
          "ask": "Does the site take card numbers on its own pages, rather than sending customers to a payment provider?",
          "answers": [
            {
              "label": "No",
              "result": "fit"
            },
            {
              "label": "Yes",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "who-switches",
          "ask": "Who will switch the live site to the new PHP version?",
          "answers": [
            {
              "label": "My host, or me in the control panel",
              "result": "fit"
            },
            {
              "label": "Nobody yet",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "php-7-site-to-php-8",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/php-7-site-to-php-8/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=php-7-site-to-php-8&source=%2Fservices%2Fphp-7-site-to-php-8%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=php-7-site-to-php-8&body=SI-Outcome%3A%20php-7-site-to-php-8%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fphp-7-site-to-php-8%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "php-contact-form-emails-not-arriving",
      "url": "https://syntheticindustry.ai/services/php-contact-form-emails-not-arriving/",
      "name": "Make your website's contact or booking form emails arrive again",
      "summary": "Repair a custom PHP or Laravel form's sending path using an authenticated mail service, verify test delivery, and preserve and log failed submissions. Inbox placement is not guaranteed.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "php",
        "laravel",
        "smtp",
        "email"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £195 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 195,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If missed enquiries matter, discuss periodic synthetic form submissions and review of failed-delivery alerts."
      },
      "result": "On a test copy, every agreed form sends through an authenticated mail service with the visitor as reply-to, and a failed send keeps the enquiry. After your site holder deploys it, a test message from each form reaches the agreed mailbox; we record whether it lands in Inbox or Junk.",
      "includes": [
        "Up to three forms on one custom PHP, Laravel or CodeIgniter site, after a captured test establishes a sending-path fault",
        "Changing how each form sends: authenticated SMTP from your mailbox provider, or a transactional email service you choose",
        "Sending from an address on your own domain, with the visitor's address as reply-to",
        "Keeping a copy of each enquiry, in the database or a protected file, when sending fails",
        "Checking that the sending service passes SPF and DKIM for your domain"
      ],
      "excludes": [
        "WordPress, Wix, Squarespace or other platforms with their own form plugins",
        "Rebuilding or redesigning the forms",
        "Spam filtering of incoming form submissions beyond what the form already has",
        "Fixing SPF, DKIM or DMARC for your staff mailboxes and other tools: that is a separate job",
        "Newsletter or bulk email"
      ],
      "eligibility": [
        "The site is custom PHP or a PHP framework such as Laravel or CodeIgniter",
        "You can get a copy of the site's files, and of the database if the form saves to one",
        "You have a mailbox on your own domain, or are happy to set up a transactional email account in your own name",
        "Someone can upload changed files to the live site, or your host will do it",
        "A test submission is accepted and either a delivery trace or the code shows a PHP mail or unauthenticated transport failure"
      ],
      "stop_conditions": [
        "The site is WordPress or a site builder: their form plugins have their own mail settings",
        "The form sends to many recipients or works as a newsletter",
        "Parts of the code are encoded and can't be changed",
        "The form collects card numbers or health records directly",
        "The form itself never accepts the submission, or the mail provider has suspended the account; that is not this sending-code fix"
      ],
      "inputs": {
        "initial": [
          "The address of the page with the form",
          "When enquiries last arrived, and whether anything changed around then, such as a host move",
          "Who provides your email: Google Workspace, Microsoft 365, your web host or another provider",
          "Any error the form shows, or a screenshot of what visitors see after sending",
          "Whether the form also saves enquiries anywhere, such as an admin page"
        ],
        "after_agreement": [
          "A copy of the site's files, and the database if the form uses one, through a download link you control",
          "Sending details for the mail service, entered by you into a configuration file we name, never sent to us in an email",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "Ten test submissions of each agreed form on the test copy each produce one captured email, with your domain as sender and the test visitor as reply-to",
          "evidence": "Captured messages from the test run, with headers"
        },
        {
          "check": "After your site holder deploys the change, a test enquiry from each form reaches the agreed mailbox without a sending error; we record Inbox or Junk placement and the actual SPF, DKIM and DMARC results",
          "evidence": "Your mailbox screenshot and the test message headers"
        },
        {
          "check": "With the mail service deliberately unreachable on the test copy, a submission is logged and its content kept, and the visitor sees an honest message",
          "evidence": "Log line and the saved enquiry from the test"
        },
        {
          "check": "A submission with line breaks and extra addresses in the name and email fields sends only to the agreed inbox",
          "evidence": "Captured message and the reviewer's note"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "built-with",
          "ask": "What is the site built with?",
          "answers": [
            {
              "label": "Custom PHP, Laravel or CodeIgniter",
              "result": "fit"
            },
            {
              "label": "WordPress",
              "result": "stop"
            },
            {
              "label": "Wix, Squarespace or another builder",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "thank-you",
          "ask": "After a test submission, what does the form and host log show?",
          "answers": [
            {
              "label": "Thank-you page, PHP mail error in host log",
              "result": "fit"
            },
            {
              "label": "A thank-you message, but no email arrives",
              "result": "check"
            },
            {
              "label": "An error message or a blank page",
              "result": "check"
            }
          ]
        },
        {
          "id": "spam-folder",
          "ask": "Have you checked the spam or junk folder of the address the form sends to?",
          "answers": [
            {
              "label": "Yes, they're in spam",
              "result": "fit"
            },
            {
              "label": "Yes, they're not there either",
              "result": "fit"
            },
            {
              "label": "Not yet",
              "result": "check"
            }
          ]
        },
        {
          "id": "own-domain",
          "ask": "Does your business have a mailbox on its own domain, such as hello@yourbusiness.co.uk?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, we use a Gmail or Outlook.com address",
              "result": "check"
            }
          ]
        },
        {
          "id": "copy-available",
          "ask": "Can you or your host give us a copy of the site's files?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "mail-path",
          "ask": "Can the host or site holder see where a test message stops?",
          "answers": [
            {
              "label": "Yes, PHP mail or the form sender fails",
              "result": "fit"
            },
            {
              "label": "The mail provider accepts it, but it lands in Junk",
              "result": "check"
            },
            {
              "label": "There is no saved submission or delivery trace",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "php-contact-form-emails-not-arriving",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/php-contact-form-emails-not-arriving/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=php-contact-form-emails-not-arriving&source=%2Fservices%2Fphp-contact-form-emails-not-arriving%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=php-contact-form-emails-not-arriving&body=SI-Outcome%3A%20php-contact-form-emails-not-arriving%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fphp-contact-form-emails-not-arriving%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "php-mysql-connect-error-database-repair",
      "url": "https://syntheticindustry.ai/services/php-mysql-connect-error-database-repair/",
      "name": "Fix “undefined function mysql_connect” on an old PHP website",
      "summary": "Replace removed mysql_* database calls in one old custom PHP site with mysqli or PDO, then test its data-entry and login flows on a copy.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "php",
        "mysql"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — from £395"
      },
      "price": {
        "model": "from",
        "amount": 395,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "After database-call repair, discuss checking the named read/write flows whenever the runtime or dependencies change."
      },
      "result": "The old site connects on the host’s supported PHP runtime and every agreed read and write flow works on a copy, with changed database code and rollback instructions handed over.",
      "includes": [
        "One custom PHP site on PHP 5 with up to 30 mysql_* call sites and one MySQL database",
        "Convert database connections and queries to mysqli or PDO with prepared parameters for inputs",
        "Test up to five data-reading and data-writing flows on a copy",
        "A handover with the changed files, test results and steps to switch the host’s PHP version"
      ],
      "excludes": [
        "WordPress or a maintained CMS",
        "A full PHP 8 compatibility upgrade across the entire application; other PHP 5 APIs may need their own scope",
        "Database schema redesign or a move to another host",
        "More than 30 call sites or a second database"
      ],
      "eligibility": [
        "The host confirms the site ran on PHP 5 before the switch",
        "The error or code contains mysql_* calls, not just mysqli_* calls",
        "The source files and a safe database copy are available",
        "You can name the pages, login or forms that depend on the database",
        "If the host has removed PHP 5, a separate restorable old environment or a tested supported-runtime rollback is available before the live change"
      ],
      "stop_conditions": [
        "Source files are encoded or the database cannot be backed up",
        "Card details are stored in the database or another regulated data problem requires a specialist",
        "The code has more than 30 mysql_* call sites or multiple hidden database layers",
        "Fixing the mysql calls reveals unrelated PHP 5 APIs blocking the site on the new runtime",
        "The host has removed the old PHP runtime and no safe alternative rollback environment can be prepared"
      ],
      "inputs": {
        "initial": [
          "The exact error message or a screenshot with private data removed",
          "The old and new PHP versions the host shows",
          "The pages and forms that need database data",
          "Whether the host can export the files and MySQL database"
        ],
        "after_agreement": [
          "A controlled copy of source files and a sanitised database export",
          "A test login if an agreed flow requires one",
          "Your host’s staging PHP version and someone who can switch live PHP",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "A scan of the patched source finds no executable mysql_* calls in the agreed code paths",
          "evidence": "Search results and changed-file list"
        },
        {
          "check": "On the target PHP version, each agreed read flow returns the same test data as on the PHP 5 copy",
          "evidence": "Before/after screenshots and database query checks"
        },
        {
          "check": "Each agreed write flow stores a legitimate apostrophe-containing test value literally once, and an SQL-metacharacter input does not change any unintended row or query structure",
          "evidence": "Saved test values and before/after row counts, plus the reviewer’s prepared-statement check"
        },
        {
          "check": "The PHP error log shows no undefined mysql_* function error during the agreed flows",
          "evidence": "Redacted log for the test window"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "error",
          "ask": "Does the error mention mysql_connect, mysql_query or another mysql_* function?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, it names mysqli or another function",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "php-old",
          "ask": "What PHP version did the site last work on?",
          "answers": [
            {
              "label": "PHP 5",
              "result": "fit"
            },
            {
              "label": "PHP 7 or newer",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "backup",
          "ask": "Can the host provide both files and a database backup?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            }
          ]
        },
        {
          "id": "call-count",
          "ask": "How much custom database code does the site have?",
          "answers": [
            {
              "label": "One small site",
              "result": "fit"
            },
            {
              "label": "Many systems or databases",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "php-mysql-connect-error-database-repair",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/php-mysql-connect-error-database-repair/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=php-mysql-connect-error-database-repair&source=%2Fservices%2Fphp-mysql-connect-error-database-repair%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=php-mysql-connect-error-database-repair&body=SI-Outcome%3A%20php-mysql-connect-error-database-repair%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fphp-mysql-connect-error-database-repair%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "ship-one-feature-with-running-preview",
      "url": "https://syntheticindustry.ai/services/ship-one-feature-with-running-preview/",
      "name": "Add one small web-app feature you can try in a private preview",
      "summary": "Try one agreed feature in a private, time-limited preview of your existing web app. Receive tests, screenshots and two revision rounds before you accept the result.",
      "level": "atomic",
      "category": "engineering",
      "buyer_type": "founder-or-cto",
      "technology": [
        "web-application",
        "git",
        "preview-environment"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — from £750"
      },
      "price": {
        "model": "from",
        "amount": 750,
        "currency": "GBP",
        "period": null,
        "payment": "The agreed fixed price is payable after you use the preview, the agreed checks pass and you sign off. No payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off"
      },
      "result": "The agreed feature works in an isolated, private preview that you can use with synthetic data. You receive its tests, screenshots and limitations, can request changes in two agreed revision rounds, and decide whether to accept it before payment. The pull request is the handover for your own merge and deploy process.",
      "includes": [
        "One small, well-described feature in one existing web application, with its screens, interactions, expected results and exclusions agreed in writing",
        "Implementation and automated checks for the agreed behaviour, plus checks of the nearby existing paths named in scope",
        "An isolated preview using synthetic fixtures, protected by access control for the agreed reviewers and available only for the agreed review period",
        "Screenshots of the running feature at the agreed desktop and mobile sizes, test evidence and a pull request",
        "Two revision rounds: each is one consolidated list of changes against the agreed acceptance criteria, followed by a revised preview and evidence"
      ],
      "excludes": [
        "New products, full rewrites, whole-app redesigns or replacement of the application's architecture",
        "Features that need new third-party accounts or paid services",
        "Native mobile applications",
        "Changes touching payments or personal-data handling without a separate security review and separately agreed scope",
        "Unbounded requests such as 'make it better', unrelated bugs or features added during review",
        "Production deployment unless separately agreed; merging and deploying through the buyer's own gates remain the buyer's decisions",
        "Permanent hosting, unrestricted public previews or ongoing preview availability after the agreed expiry"
      ],
      "eligibility": [
        "The existing web app can already run from a named source revision in isolation with synthetic fixtures",
        "You can describe one feature's user interaction and observable result, and accept a written list of criteria before implementation",
        "An existing authorised preview route can provide access-controlled hosting without a new third-party account or paid service",
        "One named buyer-side reviewer can use the preview, consolidate feedback for two rounds and accept the result",
        "The feature can stay outside payment and personal-data handling changes within this scope"
      ],
      "stop_conditions": [
        "The request cannot be narrowed to one feature with written acceptance criteria, or requires a new application or rewrite",
        "The application cannot run in the agreed isolated preview without production data, credentials, a new third-party account or a paid service",
        "Review reveals that the change touches payments or personal-data handling and needs a separate security review before it can be scoped",
        "The preview cannot be protected for the agreed reviewers, or preview isolation would allow changes to production",
        "Feedback adds another feature or exceeds the two agreed revision rounds: we pause and agree separate scope before further work"
      ],
      "inputs": {
        "initial": [
          "A plain description of one feature: who uses it, the screen or operation, their actions and the expected result",
          "The existing app's platform and framework, whether an isolated preview already exists, and any public reference that shows the desired interaction",
          "The key acceptance criteria and who will try the preview; describe the request without attaching code or private tickets",
          "Do not send credentials, code, customer data, production exports or private-access invitations in the first enquiry"
        ],
        "after_agreement": [
          "The named source revision through a company-controlled repository or code-export route, run instructions and a branch route for the pull request",
          "Synthetic fixtures and test identities, with approved substitutes for outbound messages or external side effects",
          "The written feature scope, acceptance criteria, nearby checks and the two revision rounds",
          "The authorised preview route, reviewer access list, access-control method and review-period expiry agreed before implementation; no production keys"
        ]
      },
      "acceptance": [
        {
          "check": "The named buyer-side reviewer can use the running preview to complete every agreed feature walkthrough with the expected results, and either accepts it or requests in-scope changes within the two agreed revision rounds.",
          "evidence": "The written criteria, preview URL and source revision, completed walkthrough, consolidated feedback for each used round and the buyer's final written acceptance."
        },
        {
          "check": "The feature's automated tests and the agreed nearby behaviour checks pass on the same revision shown in the preview, and the screenshots show that running revision at the agreed desktop and mobile sizes.",
          "evidence": "Test commands and outputs tied to the preview revision, plus dated screenshots identifying that revision and viewport sizes."
        },
        {
          "check": "An authorised reviewer can access the preview, an unauthorised session is denied, and the preview uses only isolated test resources and synthetic data with its expiry recorded.",
          "evidence": "Redacted allowed and denied access checks, the preview resource and fixture manifest, an isolation review and the written access list and expiry plan."
        },
        {
          "check": "The buyer receives the pull request, run instructions, limitations and reversal steps, while production remains unchanged by this job.",
          "evidence": "Handover checklist and pull-request diff, with the preview-only execution record and explicit record that no production deployment was performed."
        }
      ],
      "components": [],
      "part_of": [
        "clear-engineering-backlog",
        "vibe-engineering-lane"
      ],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": [
        "request",
        "acceptance_criteria",
        "implementation",
        "tests",
        "preview",
        "screenshots",
        "review",
        "limitations",
        "feedback",
        "acceptance"
      ],
      "eligibility_check": [
        {
          "id": "defined-feature",
          "ask": "Can you describe one feature with a specific interaction and expected result?",
          "answers": [
            {
              "label": "Yes, one feature with clear checks",
              "result": "fit"
            },
            {
              "label": "I want a new product or a rewrite",
              "result": "stop"
            },
            {
              "label": "I only know that it should be better",
              "result": "check"
            }
          ]
        },
        {
          "id": "existing-preview-route",
          "ask": "Can the current app run in an isolated, access-controlled preview with synthetic data?",
          "answers": [
            {
              "label": "Yes, using an existing authorised route",
              "result": "fit"
            },
            {
              "label": "Only production runs or a new paid service is needed",
              "result": "stop"
            },
            {
              "label": "I am not sure about isolation or access control",
              "result": "check"
            }
          ]
        },
        {
          "id": "sensitive-changes",
          "ask": "Can this feature avoid changes to payments and personal-data handling?",
          "answers": [
            {
              "label": "Yes, neither needs to change",
              "result": "fit"
            },
            {
              "label": "It changes payments or personal-data handling",
              "result": "stop"
            },
            {
              "label": "The data or payment effects are unclear",
              "result": "check"
            }
          ]
        },
        {
          "id": "buyer-preview-review",
          "ask": "Can one reviewer on your side use the preview and consolidate two rounds of feedback?",
          "answers": [
            {
              "label": "Yes, a named reviewer can accept it",
              "result": "fit"
            },
            {
              "label": "I only want a code change, no preview review",
              "result": "stop"
            },
            {
              "label": "Several reviewers need to agree first",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "ship-one-feature-with-running-preview",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/ship-one-feature-with-running-preview/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=ship-one-feature-with-running-preview&source=%2Fservices%2Fship-one-feature-with-running-preview%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=ship-one-feature-with-running-preview&body=SI-Outcome%3A%20ship-one-feature-with-running-preview%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fship-one-feature-with-running-preview%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "shopify-merchant-brand-identifier",
      "url": "https://syntheticindustry.ai/services/shopify-merchant-brand-identifier/",
      "name": "Fix Shopify products rejected for missing brand identifiers",
      "summary": "The agreed products submit truthful brand and identifier fields and show no brand/identifier errors in the next Merchant Center item diagnostic; Google approval is not guaranteed.",
      "level": "atomic",
      "category": "integrate",
      "buyer_type": "owner-without-developer",
      "technology": [
        "shopify",
        "google-merchant-center"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £175 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 175,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "For a changing product range, discuss scheduled feed diagnostics and validation of newly added product identifiers."
      },
      "result": "The agreed products submit truthful brand and identifier fields and show no brand/identifier errors in the next Merchant Center item diagnostic; Google approval is not guaranteed.",
      "includes": [
        "Map brand and GTIN/MPN inputs for at most ten named products",
        "Correct Shopify product metadata or feed mapping and recheck item-level diagnostics"
      ],
      "excludes": [
        "Google policy suspension appeals or guaranteed reinstatement",
        "Inventing GTINs, product brands or reviews",
        "Google Ads campaign management",
        "Changing unrelated collections or all catalogue items"
      ],
      "eligibility": [
        "Owner knows each item’s actual manufacturer/brand or can state it has no identifier",
        "Owner has Merchant Center item diagnostics and access to Shopify product fields"
      ],
      "stop_conditions": [
        "Merchant Center cites account-level misrepresentation rather than brand identifiers",
        "The brand or identifier cannot be verified from packaging or supplier data"
      ],
      "inputs": {
        "initial": [
          "Redacted Merchant Center error and ten affected product URLs",
          "Current brand/vendor and any actual GTIN/MPN values"
        ],
        "after_agreement": [
          "Owner-controlled test product export and scoped store/catalogue access",
          "Merchant Center diagnostics without advertising spend access",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "Each agreed item submits the owner-confirmed brand/identifier values after the next feed refresh",
          "evidence": "Merchant Center before/after item detail with IDs redacted"
        },
        {
          "check": "After Merchant Center processes the refreshed feed, every named item has no original brand/identifier error. A pending refresh or a remaining identifier error is not a pass; unrelated policy decisions stay outside this scope.",
          "evidence": "Dated item diagnostic for each named item after processing, paired with the owner-approved identifier mapping."
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "does-the-diagnostic-name-brand-gtin-or-product-identifiers-for-these-ite",
          "ask": "Does the diagnostic name brand, GTIN or product identifiers for these items?",
          "answers": [
            {
              "label": "Yes, item-level errors",
              "result": "fit"
            },
            {
              "label": "No, account suspension",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-confirm-the-real-brand-from-packaging-or-supplier-documents",
          "ask": "Can you confirm the real brand from packaging or supplier documents?",
          "answers": [
            {
              "label": "Yes, known brand",
              "result": "fit"
            },
            {
              "label": "No, uncertain manufacturer",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "are-at-most-ten-named-product-ids-affected",
          "ask": "Are at most ten named product IDs affected?",
          "answers": [
            {
              "label": "Yes, capped set",
              "result": "fit"
            },
            {
              "label": "No, all catalogue products",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "shopify-merchant-brand-identifier",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/shopify-merchant-brand-identifier/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=shopify-merchant-brand-identifier&source=%2Fservices%2Fshopify-merchant-brand-identifier%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=shopify-merchant-brand-identifier&body=SI-Outcome%3A%20shopify-merchant-brand-identifier%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fshopify-merchant-brand-identifier%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "shopify-product-tab-after-theme-update",
      "url": "https://syntheticindustry.ai/services/shopify-product-tab-after-theme-update/",
      "name": "Restore a Shopify product tab lost after a theme update",
      "summary": "The agreed product-description tab opens and closes on a duplicated theme on phone and desktop while the underlying product text remains unchanged.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "shopify",
        "liquid",
        "javascript"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £125 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 125,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If the theme changes often, discuss a mobile, keyboard and cart regression check before each release."
      },
      "result": "The agreed product-description tab opens and closes on a duplicated theme on phone and desktop while the underlying product text remains unchanged.",
      "includes": [
        "Identify the old custom tab and its content source",
        "Replace only the lost tab interaction on a duplicated theme, without relying on the removed dependency"
      ],
      "excludes": [
        "Whole-store theme migration",
        "Editing product descriptions or search ranking",
        "Checkout customisation",
        "Restoring paid app features without the app licence"
      ],
      "eligibility": [
        "A previous theme copy shows the tab working or the intended behaviour can be described",
        "A duplicated unpublished theme is available for comparison"
      ],
      "stop_conditions": [
        "The missing content is in an app account or licence the owner no longer has",
        "There is no recoverable product content or prior theme, requiring a new feature design"
      ],
      "inputs": {
        "initial": [
          "Public URL and screenshot of old tab, without customer data",
          "Old and new theme names and approximate update date"
        ],
        "after_agreement": [
          "Owner-created unpublished theme duplicate and safe preview access",
          "Theme code export or collaborator access scoped to the theme",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "The agreed product has a usable tab that reveals the same product text at 390px and 1440px in theme preview",
          "evidence": "Two viewport screenshots and old/new text comparison"
        },
        {
          "check": "The tab can be operated by keyboard and the add-to-cart control still adds the right variant",
          "evidence": "Recorded keyboard and cart test in preview"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "did-this-tab-exist-before-replacing-or-updating-the-theme",
          "ask": "Did this tab exist before replacing or updating the theme?",
          "answers": [
            {
              "label": "Yes, it existed before the update",
              "result": "fit"
            },
            {
              "label": "No, I want a new tab feature",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-see-the-product-text-in-shopify-admin",
          "ask": "Can you see the product text in Shopify admin?",
          "answers": [
            {
              "label": "Yes, text exists",
              "result": "fit"
            },
            {
              "label": "No, text is missing",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-duplicate-the-theme-without-publishing-it",
          "ask": "Can you duplicate the theme without publishing it?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "shopify-product-tab-after-theme-update",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/shopify-product-tab-after-theme-update/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=shopify-product-tab-after-theme-update&source=%2Fservices%2Fshopify-product-tab-after-theme-update%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=shopify-product-tab-after-theme-update&body=SI-Outcome%3A%20shopify-product-tab-after-theme-update%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fshopify-product-tab-after-theme-update%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "shopify-uninstalled-review-app-residue",
      "url": "https://syntheticindustry.ai/services/shopify-uninstalled-review-app-residue/",
      "name": "Remove leftover Shopify review-app code from one product template",
      "summary": "On a duplicate theme the current review widget displays one copy of the expected review content, and retired app code no longer runs on the agreed product.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "shopify",
        "liquid"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £149 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 149,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If you change store apps regularly, discuss a scoped theme/app compatibility check before each switch."
      },
      "result": "On a duplicate theme the current review widget displays one copy of the expected review content, and retired app code no longer runs on the agreed product.",
      "includes": [
        "Trace one retired review app and one replacement app in a duplicated theme",
        "Remove only confirmed retired theme assets/references and restore the agreed review block"
      ],
      "excludes": [
        "Migrating historic reviews between platforms",
        "Buying or configuring a new review subscription",
        "Removing every uninstalled app in the store",
        "Guaranteeing an external review platform restores lost content"
      ],
      "eligibility": [
        "The owner names the retired and current review apps",
        "The review source data still exists in the current app or approved export"
      ],
      "stop_conditions": [
        "Review records were deleted from the vendor with no export",
        "Unclear which code belongs to the live review app; stop for vendor confirmation"
      ],
      "inputs": {
        "initial": [
          "Product URL and screenshot of duplicate or missing reviews",
          "Names of removed and active review apps"
        ],
        "after_agreement": [
          "Duplicate theme preview and owner-approved app access in test context",
          "Non-sensitive export proving current reviews exist",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "On one agreed product page the active app shows reviews once, with the same count as its owner dashboard",
          "evidence": "Preview screenshot and redacted app count"
        },
        {
          "check": "The retired app script/reference is absent in theme output without breaking product page or cart",
          "evidence": "Diff and preview network/console check"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "is-a-different-reviews-app-active-now",
          "ask": "Is a different reviews app active now?",
          "answers": [
            {
              "label": "Yes, replacement app",
              "result": "fit"
            },
            {
              "label": "No current app or review records",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-identify-which-old-app-was-uninstalled",
          "ask": "Can you identify which old app was uninstalled?",
          "answers": [
            {
              "label": "Yes, named app",
              "result": "fit"
            },
            {
              "label": "No, unknown app owner",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-test-on-an-unpublished-theme-copy",
          "ask": "Can you test on an unpublished theme copy?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "shopify-uninstalled-review-app-residue",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/shopify-uninstalled-review-app-residue/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=shopify-uninstalled-review-app-residue&source=%2Fservices%2Fshopify-uninstalled-review-app-residue%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=shopify-uninstalled-review-app-residue&body=SI-Outcome%3A%20shopify-uninstalled-review-app-residue%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fshopify-uninstalled-review-app-residue%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "ssl-certificate-expired-not-secure",
      "url": "https://syntheticindustry.ai/services/ssl-certificate-expired-not-secure/",
      "name": "Clear the “Not secure” warning after your site's certificate expired",
      "summary": "Find why your site’s HTTPS certificate expired, replace it through your host, check the renewal path where the host exposes it, and set an independent expiry warning.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "ssl",
        "https",
        "lets-encrypt",
        "dns"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £149 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 149,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed checks pass and you sign off. No advance payment.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "Discuss expiry-alert review and renewal checks if you need a standing responsibility rather than a one-off repair."
      },
      "result": "Your domain with and without www serves a valid certificate and a tested expiry warning. We check the host’s renewal configuration and logs or a supported dry run; if future auto-renewal cannot be proved, we say so rather than promise it.",
      "includes": [
        "Finding why the certificate expired or doesn't match, from public checks and the renewal log your host shows you",
        "Written fix steps for your host or you: a DNS record, a redirect rule, a panel setting or a certificate request",
        "Checking the new certificate covers the domain and www and serves the full chain",
        "Forcing visitors from http to https once the certificate is valid",
        "An outside expiry check that emails you at least 14 days before the certificate ends",
        "A check of the host’s renewal schedule, failure log or supported dry run; if the host exposes none, a documented limitation and outside alert"
      ],
      "excludes": [
        "Rewriting pages that load images or scripts over http, beyond a list of what we find on the home page",
        "Moving the site to another host",
        "Servers you manage yourself without a control panel or host support: that needs a different job",
        "Extended validation or organisation certificates bought from a certificate seller",
        "Hacked-site recovery"
      ],
      "eligibility": [
        "Your site is on hosting with a control panel, or a host whose support team will apply the steps",
        "You can see or change where the domain's DNS points, or can say who can",
        "The site loaded normally over https before the warning appeared, or you want https added on the same host",
        "You can name the addresses that must work, such as with and without www"
      ],
      "stop_conditions": [
        "The domain itself has expired or is held by someone who won't make changes",
        "Signs of a hack, such as redirects to other sites or pages you didn't create",
        "The host's plan doesn't allow any certificate, free or uploaded, and you don't want to change plan or host",
        "The warning is for a page or service you don't control, such as a payment provider or a third-party booking widget"
      ],
      "inputs": {
        "initial": [
          "Your site's address and any other addresses that should work, such as with www",
          "A screenshot of the browser warning, including the error code if shown",
          "Who hosts the site, and whether you use Cloudflare or a similar service in front of it",
          "Anything that changed recently: DNS, nameservers, host, or a certificate renewal reminder you ignored",
          "Any SSL or AutoSSL error your host's panel shows, as a screenshot"
        ],
        "after_agreement": [
          "Screenshots of the panel's SSL/TLS page or the host's renewal log, as we ask for them",
          "Confirmation from your host or you when each fix step is done, so we can re-check",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "Each agreed address opens over https in a current browser with no certificate warning, and the certificate's names include that address",
          "evidence": "Certificate details and a screenshot per address"
        },
        {
          "check": "An independent public certificate test reports the full chain is served and the certificate is valid for at least 30 more days",
          "evidence": "Saved report from the test"
        },
        {
          "check": "Requests to each address over http are redirected to https with a single redirect",
          "evidence": "Redirect check output per address"
        },
        {
          "check": "The expiry alert is active for the domain and a test alert reaches your inbox",
          "evidence": "Screenshot of the alert's settings and the test email"
        },
        {
          "check": "The host panel shows an enabled renewal schedule and its latest success or a supported dry-run result, or the handover explicitly marks future renewal unverified and relies on the tested expiry alert",
          "evidence": "Host renewal settings and redacted log or dry-run output; otherwise a dated unverified note and working alert"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "warning-type",
          "ask": "What do visitors see?",
          "answers": [
            {
              "label": "A full-page warning before the site",
              "result": "fit"
            },
            {
              "label": "The site loads, but “Not secure” or no padlock",
              "result": "check"
            },
            {
              "label": "A different site, or a redirect elsewhere",
              "result": "stop"
            }
          ]
        },
        {
          "id": "hosting-type",
          "ask": "How is the site hosted?",
          "answers": [
            {
              "label": "Shared or managed hosting with a control panel",
              "result": "fit"
            },
            {
              "label": "A server we run ourselves, with no panel",
              "result": "check"
            },
            {
              "label": "Wix, Squarespace or Shopify",
              "result": "stop"
            }
          ]
        },
        {
          "id": "domain-ok",
          "ask": "Is the domain itself paid up and in your name or your business's?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "It may have expired",
              "result": "stop"
            },
            {
              "label": "Someone else holds it",
              "result": "check"
            }
          ]
        },
        {
          "id": "recent-change",
          "ask": "Did anything change shortly before the warning started?",
          "answers": [
            {
              "label": "DNS, nameservers, Cloudflare or a host move",
              "result": "fit"
            },
            {
              "label": "Nothing I know of",
              "result": "fit"
            }
          ]
        },
        {
          "id": "third-party",
          "ask": "Is the warning on your own site's pages, or only on a booking, payment or shop page run by another company?",
          "answers": [
            {
              "label": "On my own site",
              "result": "fit"
            },
            {
              "label": "Only on another company's page",
              "result": "stop"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "ssl-certificate-expired-not-secure",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/ssl-certificate-expired-not-secure/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=ssl-certificate-expired-not-secure&source=%2Fservices%2Fssl-certificate-expired-not-secure%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=ssl-certificate-expired-not-secure&body=SI-Outcome%3A%20ssl-certificate-expired-not-secure%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fssl-certificate-expired-not-secure%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "stripe-memberstack-access-after-payment",
      "url": "https://syntheticindustry.ai/services/stripe-memberstack-access-after-payment/",
      "name": "Restore paid member access after Stripe takes a payment",
      "summary": "One agreed test purchase activates exactly the intended membership tier on a test account; a failed payment activates nothing.",
      "level": "atomic",
      "category": "integrate",
      "buyer_type": "owner-without-developer",
      "technology": [
        "stripe",
        "memberstack",
        "webflow"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £195 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 195,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "Discuss recurring synthetic entitlement checks and investigation of failed access events, with no authority to charge or refund customers."
      },
      "result": "One agreed test purchase activates exactly the intended membership tier on a test account; a failed payment activates nothing.",
      "includes": [
        "Trace a single Stripe Checkout-to-Memberstack function on a test copy",
        "Fix event-to-member matching and the failed Memberstack API call, then test one tier"
      ],
      "excludes": [
        "Creating a whole membership site",
        "Changing prices, tax or past member records",
        "Assigning paid plans through unsupported Memberstack API methods",
        "Real charges or automatic live customer reconciliation"
      ],
      "eligibility": [
        "The buyer owns the Stripe, Webflow and Memberstack accounts",
        "A test member, a test-mode purchase and function logs can reproduce the issue"
      ],
      "stop_conditions": [
        "The requested Memberstack paid plan cannot be assigned by the supported API",
        "The Stripe account itself has declined the payment or the owner cannot authorise the site"
      ],
      "inputs": {
        "initial": [
          "Redacted failed call status and expected tier",
          "Which test purchase did not unlock which page"
        ],
        "after_agreement": [
          "Owner-provided test environment and least-privilege code handoff",
          "Redacted sample event and disposable test member",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "One successful Stripe test event updates one disposable member to the agreed tier, without creating a second member",
          "evidence": "Redacted event ID, member ID and tier screen"
        },
        {
          "check": "A failed-payment event leaves the disposable member on the free tier",
          "evidence": "Failed event and tier screen"
        },
        {
          "check": "Replaying the same successful signed test event twice does not create a second member or entitlement; an invalid signature and an event for another user cannot grant access.",
          "evidence": "Redacted event IDs, rejection responses and before/after member and entitlement counts."
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "does-stripe-show-a-successful-test-payment-for-the-affected-member",
          "ask": "Does Stripe show a successful test payment for the affected member?",
          "answers": [
            {
              "label": "Yes, paid in test mode",
              "result": "fit"
            },
            {
              "label": "No, payment failed",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "do-the-function-logs-show-a-memberstack-api-error-after-that-event",
          "ask": "Do the function logs show a Memberstack API error after that event?",
          "answers": [
            {
              "label": "Yes, the API call fails",
              "result": "fit"
            },
            {
              "label": "No webhook arrives",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-the-requested-tier-be-set-through-the-memberstack-api-you-use",
          "ask": "Can the requested tier be set through the Memberstack API you use?",
          "answers": [
            {
              "label": "Yes, supported tier",
              "result": "fit"
            },
            {
              "label": "No, the API cannot assign this plan",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "stripe-memberstack-access-after-payment",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/stripe-memberstack-access-after-payment/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=stripe-memberstack-access-after-payment&source=%2Fservices%2Fstripe-memberstack-access-after-payment%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=stripe-memberstack-access-after-payment&body=SI-Outcome%3A%20stripe-memberstack-access-after-payment%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fstripe-memberstack-access-after-payment%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "stripe-nextjs-supabase-subscriptions",
      "url": "https://syntheticindustry.ai/services/stripe-nextjs-supabase-subscriptions/",
      "name": "Add monthly and yearly Stripe plans to a Next.js app",
      "summary": "One test account can buy, renew and cancel the agreed plan; Supabase reflects the correct current access state without duplicate subscriptions.",
      "level": "atomic",
      "category": "integrate",
      "buyer_type": "owner-without-developer",
      "technology": [
        "stripe",
        "nextjs",
        "supabase"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Ask for a fixed price"
      },
      "price": {
        "model": "quote",
        "amount": null,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "After implementation, discuss maintaining test-mode subscription lifecycle and access-control checks as plans or code change."
      },
      "result": "One test account can buy, renew and cancel the agreed plan; Supabase reflects the correct current access state without duplicate subscriptions.",
      "includes": [
        "Wire two named plans with monthly and yearly prices through hosted Stripe Checkout",
        "Handle paid, failed, renewed and cancelled states in a test-mode webhook; expose Stripe Billing Portal"
      ],
      "excludes": [
        "Custom card-number collection or Stripe Connect payouts",
        "Tax advice or VAT settings",
        "Migrating old subscriber records",
        "A new login system or additional plan catalogue"
      ],
      "eligibility": [
        "The app already has working login and a Supabase user identifier",
        "The owner can create the four Stripe prices in test mode and authorise plan rules"
      ],
      "stop_conditions": [
        "The app has no stable user identifier to attach to Stripe customers",
        "The buyer needs marketplace payouts, legal tax configuration or an unsupported bespoke checkout"
      ],
      "inputs": {
        "initial": [
          "Plan names, proposed monthly/annual amounts and intended access per plan",
          "Redacted auth and database schema sketch, without keys"
        ],
        "after_agreement": [
          "Test-mode plan IDs and a disposable account through owner-controlled secret settings",
          "Read-only code handoff and test database with dummy users",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "A successful test-mode Checkout activates the purchased plan on one account and a replay creates no second subscription row",
          "evidence": "Stripe test event ID and redacted Supabase plan row"
        },
        {
          "check": "A failed renewal or cancellation removes or changes access according to the owner-approved rule, not merely the browser redirect",
          "evidence": "Test event log and before/after account access screens"
        },
        {
          "check": "Each of the four test price IDs (two plans, monthly and yearly) opens Checkout and grants only its agreed plan to the matching disposable account.",
          "evidence": "Four-row matrix of price ID, subscription ID, plan and observed protected-page access."
        },
        {
          "check": "A successful simulated renewal preserves access; Billing Portal shows the correct account subscription and cancellation changes access at the owner-agreed effective date.",
          "evidence": "Stripe test-clock/event results, portal walkthrough and access checks before and after cancellation."
        },
        {
          "check": "Invalid webhook signatures are rejected; replayed and stale test events do not regress entitlement; a different signed-in user cannot read or change another subscription.",
          "evidence": "Negative-test log, Supabase row-policy checks and duplicate/stale event results."
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "can-one-signed-in-user-be-matched-to-exactly-one-database-user-id",
          "ask": "Can one signed-in user be matched to exactly one database user ID?",
          "answers": [
            {
              "label": "Yes, stable ID",
              "result": "fit"
            },
            {
              "label": "No, users lack stable IDs",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "are-you-selling-your-own-plans-rather-than-paying-multiple-sellers",
          "ask": "Are you selling your own plans rather than paying multiple sellers?",
          "answers": [
            {
              "label": "Our own plans",
              "result": "fit"
            },
            {
              "label": "We split proceeds among sellers",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-make-test-mode-prices-without-sharing-secret-keys-by-email",
          "ask": "Can you make test-mode prices without sharing secret keys by email?",
          "answers": [
            {
              "label": "Yes, owner manages keys",
              "result": "fit"
            },
            {
              "label": "No, keys must be emailed",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "stripe-nextjs-supabase-subscriptions",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/stripe-nextjs-supabase-subscriptions/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=stripe-nextjs-supabase-subscriptions&source=%2Fservices%2Fstripe-nextjs-supabase-subscriptions%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=stripe-nextjs-supabase-subscriptions&body=SI-Outcome%3A%20stripe-nextjs-supabase-subscriptions%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fstripe-nextjs-supabase-subscriptions%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "vibe-engineering-lane",
      "url": "https://syntheticindustry.ai/vibe-engineering/",
      "page": "external",
      "name": "Vibe Engineering Lane: a managed engineering lane for your product",
      "summary": "A managed lane for one existing web product: one active item, up to four scoped monthly items, working previews, checks and separate review. Proposed US$10,000/month; scope and terms by proposal.",
      "level": "lane",
      "category": "engineering",
      "buyer_type": "founder-or-cto",
      "technology": [
        "web-applications",
        "github"
      ],
      "version": "2026-10-10",
      "lifecycle": "candidate",
      "sale": {
        "mode": "quote",
        "cta": "Discuss an engineering lane"
      },
      "price": {
        "model": "quote",
        "amount": null,
        "currency": "USD",
        "period": "month",
        "payment": "Payment, incomplete-work treatment, billing, cancellation and renewal are agreed in the written proposal before the engagement starts. No charge, reservation or automatic subscription begins from an enquiry.",
        "tested": false
      },
      "term": {
        "kind": "recurring",
        "period": "month",
        "cancellation": "Cancellation, renewal and treatment of incomplete work must be agreed in the written proposal before starting; no automatic subscription begins from this website.",
        "refund": "Any refund and incomplete-work billing treatment are agreed before commitment; no unagreed refund or end-of-month completion promise is made."
      },
      "result": "Describe the desired behaviour and inspect a running non-production preview or runnable backend example with relevant checks, separate review and limitations. Accept it or request corrections against the agreed criteria; live release requires an agreed authorised route.",
      "includes": [
        "One existing web product, one active work item at a time, and no more than four agreed bounded items in the monthly plan",
        "Each item is a small feature slice, reproducible bug repair or bounded maintenance change, not a ticket of arbitrary size",
        "Context gathering, implementation, relevant checks, separate review, a demonstrable result and corrections against agreed acceptance criteria",
        "A written progress update each week while the lane is active; timing and capacity agreed in the written proposal"
      ],
      "excludes": [
        "Unlimited work, a guarantee of four completed items, a fixed turnaround guarantee or clearing an entire backlog",
        "24/7 support, on-call incident response, security certification, regulated or safety-critical systems",
        "A whole-product rewrite, unrestricted production access, ongoing hosting or monitoring",
        "Unagreed supplier or infrastructure charges, live changes without authorised release approval, or an already-retained human supervisor"
      ],
      "eligibility": [
        "One existing web product with a repeatable run route and a decision-maker authorised to prioritise and accept outcomes",
        "A safe code and data route, usable isolated test environment and permitted synthetic data can be agreed before acceptance",
        "Stack fit, review arrangements, IP/data terms, contracting identity and release authority are resolved before the engagement starts"
      ],
      "stop_conditions": [
        "Safe delivery still depends on unresolved private access, production credentials, real customer data or missing review arrangements",
        "The requested work is an emergency, whole-product rewrite, regulated or safety-critical system or replacement for the entire engineering function",
        "No authorised decision-maker can prioritise, clarify product decisions and accept or request corrections"
      ],
      "inputs": {
        "initial": [
          "A short description of the product, with a public URL if useful",
          "Two or three representative desired outcomes, timing constraints and who sets priorities",
          "Whether the proposed US$10,000 monthly budget is realistic; no code, customer data, credentials or account invitations"
        ],
        "after_agreement": [
          "The agreed company-controlled code handoff and instructions to run the product and checks in an isolated non-production environment",
          "Permitted synthetic test fixtures and a named decision-maker for meaningful product decisions and acceptance",
          "Written review arrangements, IP/data terms, contracting identity and approvals for any named live change"
        ]
      },
      "acceptance": [
        {
          "check": "The agreed behaviour and relevant edge cases are demonstrated in a non-production preview or runnable backend example with the named checks attached.",
          "evidence": "Acceptance brief, running example or preview, relevant test/runtime results and screenshots where useful."
        },
        {
          "check": "Separate review findings and known limitations are recorded, with corrections or explicit agreed resolutions.",
          "evidence": "Independent review and finding dispositions in the delivery packet; human review only if separately arranged."
        },
        {
          "check": "The customer can inspect the result and explicitly accept or request corrections without needing to operate GitHub.",
          "evidence": "Plain-English walkthrough, accept-or-revise feedback and accepted outcome record."
        }
      ],
      "components": [
        {
          "outcome": "ship-one-feature-with-running-preview",
          "role": "included",
          "contributes": "counts",
          "needs": []
        },
        {
          "outcome": "fix-one-bug-with-regression-test",
          "role": "included",
          "contributes": "counts",
          "needs": []
        },
        {
          "outcome": "keep-github-actions-ci-green",
          "role": "optional",
          "contributes": "informational",
          "needs": []
        },
        {
          "outcome": "clear-engineering-backlog",
          "role": "optional",
          "contributes": "informational",
          "needs": []
        }
      ],
      "part_of": [
        "operate-software-engineering"
      ],
      "completion": {
        "rule": "continuous",
        "text": "Each item has explicit acceptance criteria and an accept-or-revise decision. Four is a monthly scope ceiling, not a completion guarantee. The recurring relationship continues only under agreed renewal terms."
      },
      "responsibility": null,
      "evidence_delivered": [
        "request",
        "acceptance_criteria",
        "implementation",
        "tests",
        "preview",
        "screenshots",
        "review",
        "limitations",
        "feedback",
        "acceptance"
      ],
      "eligibility_check": null,
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "vibe-engineering-lane",
          "SI-Mode": "quote",
          "SI-Page": "https://syntheticindustry.ai/vibe-engineering/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=vibe-engineering-lane&source=%2Fvibe-engineering%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=vibe-engineering-lane&body=SI-Outcome%3A%20vibe-engineering-lane%0ASI-Mode%3A%20quote%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fvibe-engineering%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "quote"
      }
    },
    {
      "id": "woocommerce-checkout-after-update",
      "url": "https://syntheticindustry.ai/services/woocommerce-checkout-after-update/",
      "name": "Fix a WooCommerce checkout that broke after an update",
      "summary": "Find and fix the one fault that stops customers completing an order after an update, proved with a test order on a copy of your store.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "woocommerce",
        "wordpress",
        "php"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Ask for a fixed price"
      },
      "price": {
        "model": "quote",
        "amount": null,
        "currency": "GBP",
        "period": null,
        "payment": "After the test order passes on staging and you sign off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "Discuss a test-mode checkout regression check before updates, with separate rules for alerts and live changes."
      },
      "result": "One broken checkout path works again on a copy of your store: a test order goes through with the right total and status, and you get the fix with steps to apply and undo it.",
      "includes": [
        "One failing checkout path you can describe, for example guest checkout paying by card",
        "Reproducing the failure on a staging copy with the payment gateway in test mode",
        "Finding which update or conflict causes it: a plugin, a theme template, WooCommerce or PHP",
        "The smallest change that fixes it, then re-testing checkout and the shipping, tax and order-email steps next to it"
      ],
      "excludes": [
        "Payment provider account problems, disputes or refunds",
        "Adding a new payment method or gateway",
        "Any live card charge or refund",
        "Repairing past orders or customer records",
        "Redesign, speed work or unrelated plugins",
        "A PCI compliance audit or ongoing monitoring"
      ],
      "eligibility": [
        "You can describe one failing path: what the customer does, what should happen and what happens instead",
        "You or your host can make a staging copy where test orders are safe",
        "Your payment gateway has a test or sandbox mode you can turn on in staging",
        "Someone you authorise holds the hosting account and can apply the fix to the live store"
      ],
      "stop_conditions": [
        "The fault only appears with real cards, so it can't be reproduced in test mode",
        "Orders or customer data can't be copied safely to staging",
        "There are signs of a hack or a card-skimming script",
        "The payment provider's own service or account settings cause the failure",
        "Reproduction shows a cause outside the agreed path: we stop and re-quote, or hand over what we found"
      ],
      "inputs": {
        "initial": [
          "The error text or a screenshot, with customer details removed",
          "The page and step where it fails, and what should happen instead",
          "When the last order went through, and what was updated since",
          "WooCommerce, WordPress, PHP and theme versions, if you know them",
          "Which payment methods fail, and whether test mode is available"
        ],
        "after_agreement": [
          "A staging copy shared the way you choose, such as an invite to your host's staging site",
          "Test-mode payment keys entered by you in staging; we never see live keys",
          "A staging admin login, not your live one",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "On staging, the agreed test product, address and test card complete checkout and create exactly one order with the correct total and status",
          "evidence": "Order number, total and status, with a screenshot"
        },
        {
          "check": "A declined test card leaves no paid order behind",
          "evidence": "Screenshot of the declined attempt and the order list"
        },
        {
          "check": "Shipping, tax and the order confirmation email are correct for the test order",
          "evidence": "Redacted email and order totals"
        },
        {
          "check": "No new fatal-errors log entries appear during the test run",
          "evidence": "Log listing for the test window"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "all-methods",
          "ask": "Does checkout fail with every payment method?",
          "answers": [
            {
              "label": "Yes, every method",
              "result": "fit"
            },
            {
              "label": "Only one method",
              "result": "check"
            },
            {
              "label": "I don't know",
              "result": "check"
            }
          ]
        },
        {
          "id": "after-update",
          "ask": "Did it start after an update?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No change I know of",
              "result": "check"
            }
          ]
        },
        {
          "id": "test-mode",
          "ask": "Can you take a payment with the gateway in test or sandbox mode?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "Only real payments fail",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "staging",
          "ask": "Can you or your host make a staging copy of the store?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "hack-signs",
          "ask": "Any sign of a hack: admin users you don't recognise, a payment form that looks different, or redirects to other sites?",
          "answers": [
            {
              "label": "No",
              "result": "fit"
            },
            {
              "label": "Yes",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "who-applies",
          "ask": "Who can apply the fix to the live store?",
          "answers": [
            {
              "label": "Me, or someone with hosting access",
              "result": "fit"
            },
            {
              "label": "Nobody yet",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "woocommerce-checkout-after-update",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/woocommerce-checkout-after-update/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=woocommerce-checkout-after-update&source=%2Fservices%2Fwoocommerce-checkout-after-update%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=woocommerce-checkout-after-update&body=SI-Outcome%3A%20woocommerce-checkout-after-update%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fwoocommerce-checkout-after-update%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "wordpress-critical-error-after-update",
      "url": "https://syntheticindustry.ai/services/wordpress-critical-error-after-update/",
      "name": "Bring back a WordPress site showing a critical error or HTTP 500",
      "summary": "Find the PHP fatal error behind a site that stopped loading after an update, fix it on a copy, and hand over a tested change with rollback steps.",
      "level": "atomic",
      "category": "repair",
      "buyer_type": "owner-without-developer",
      "technology": [
        "wordpress",
        "php"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Ask for a fixed price"
      },
      "price": {
        "model": "quote",
        "amount": null,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed pages load on staging and you sign off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "Discuss testing site updates on staging and checking agreed pages after each approved release."
      },
      "result": "The pages you name load again on a copy of your site with no fatal error, the cause is named, and you get the tested change with steps to apply it live and to undo it.",
      "includes": [
        "Finding the fatal error behind one failure, even if it shows on many pages",
        "Reproducing it on a staging copy of the site",
        "The smallest change that fixes it: a compatible plugin or theme version, a code patch, or a PHP-version compatibility fix",
        "Re-testing the agreed pages, the admin and login"
      ],
      "excludes": [
        "Malware cleanup or hacked-site recovery",
        "Database repair or restoring lost content",
        "Recurring 503s, timeouts or slowness from server load",
        "Hosting moves, DNS or email delivery",
        "Redesign or new features",
        "Changing the live site ourselves; your site holder applies the fix"
      ],
      "eligibility": [
        "You or your host can make a staging copy or a full backup of files and database",
        "The error started after a change you can roughly date: an update, a PHP switch or a new plugin",
        "Someone can read the PHP error log or the recovery email WordPress sends, or let us read the log on staging",
        "The site's files and database can be reached, directly or through your host's staging tool"
      ],
      "stop_conditions": [
        "Signs of a hack: admin users you don't know, injected code or spam pages",
        "No staging copy or backup can be made safely",
        "The host's server is at fault, such as a database server that is down or limits only the host can change",
        "The error is inside a paid plugin whose code or licence we can't get: we hand the evidence to its vendor"
      ],
      "inputs": {
        "initial": [
          "The exact message or a screenshot, with personal details removed",
          "Pages that fail and pages that still work",
          "What changed, and roughly when",
          "Only the plugin or theme name and relevant error details from any recovery email, with recovery links, login tokens, file paths, email addresses and personal information removed; do not forward the email",
          "WordPress, PHP and theme versions, if you know them",
          "Whether your host offers staging"
        ],
        "after_agreement": [
          "A staging copy or backup shared the way you choose, such as an invite to your host's staging site",
          "The PHP error log from staging",
          "A staging admin login, not your live one",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "Each agreed page returns HTTP 200 on staging and shows its normal content",
          "evidence": "Before and after status code and a screenshot per page"
        },
        {
          "check": "No new PHP fatal error appears in the staging error log during the test run",
          "evidence": "Redacted log excerpt for the test window"
        },
        {
          "check": "The admin login and the Plugins and Appearance screens load",
          "evidence": "Screenshots of each named screen"
        },
        {
          "check": "After your site holder applies the fix, the same public pages return HTTP 200 on the live site",
          "evidence": "Your check, or a status check we run on the public pages"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "still-failing",
          "ask": "Is the error still showing now?",
          "answers": [
            {
              "label": "Yes, every time",
              "result": "fit"
            },
            {
              "label": "It comes and goes",
              "result": "check"
            }
          ]
        },
        {
          "id": "after-change",
          "ask": "Did it start right after an update or change?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No change I know of",
              "result": "check"
            }
          ]
        },
        {
          "id": "recovery-email",
          "ask": "Did WordPress email the admin address “Your Site is Experiencing a Technical Issue”?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, or I can't check",
              "result": "fit"
            }
          ]
        },
        {
          "id": "hack-signs",
          "ask": "Any sign of a hack: admin users you don't recognise, pages you didn't write, or redirects to other sites?",
          "answers": [
            {
              "label": "No",
              "result": "fit"
            },
            {
              "label": "Yes",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "staging",
          "ask": "Can you or your host make a staging copy or a full backup?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "wordpress-critical-error-after-update",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/wordpress-critical-error-after-update/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=wordpress-critical-error-after-update&source=%2Fservices%2Fwordpress-critical-error-after-update%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=wordpress-critical-error-after-update&body=SI-Outcome%3A%20wordpress-critical-error-after-update%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fwordpress-critical-error-after-update%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "zapier-facebook-leads-to-salesforce",
      "url": "https://syntheticindustry.ai/services/zapier-facebook-leads-to-salesforce/",
      "name": "Make new Facebook leads appear in Salesforce again",
      "summary": "A new synthetic lead submitted to the agreed Facebook form starts one Zap and creates one Salesforce test lead with the agreed fields.",
      "level": "atomic",
      "category": "integrate",
      "buyer_type": "owner-without-developer",
      "technology": [
        "zapier",
        "facebook-lead-ads",
        "salesforce"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £165 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 165,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "If the connection is business-critical, discuss synthetic lead checks and review of failed runs without contacting real leads."
      },
      "result": "A new synthetic lead submitted to the agreed Facebook form starts one Zap and creates one Salesforce test lead with the agreed fields.",
      "includes": [
        "Check Facebook form subscription and permissions for one Zap",
        "Restore one trigger and map up to four fields into a Salesforce test lead"
      ],
      "excludes": [
        "Accessing real lead lists or contacting leads",
        "Rebuilding Facebook campaigns or ad creative",
        "Salesforce schema redesign or historic lead backfill",
        "Accepting login passwords by email"
      ],
      "eligibility": [
        "Owner has authority for the Facebook Page, lead form, Zapier and Salesforce",
        "A disposable Lead Ads test submission and Salesforce test account are possible"
      ],
      "stop_conditions": [
        "Owner lacks Facebook lead-access permissions or Page control",
        "Real personal leads are the only available test data"
      ],
      "inputs": {
        "initial": [
          "Form name and redacted Zap history around one missed lead",
          "Which Salesforce lead fields are expected"
        ],
        "after_agreement": [
          "Owner-approved scoped Page/Zap invite and test Salesforce environment",
          "Synthetic lead generated through Meta’s Lead Ads Testing Tool",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "One newly submitted dummy lead creates one Zap history run without a manual test action",
          "evidence": "Meta test lead timestamp and Zap run ID"
        },
        {
          "check": "Salesforce contains one dummy lead with the four agreed values. Replaying the same source lead does not create a second record; a new source lead creates its own record.",
          "evidence": "Source lead IDs, replay/new-event Zap history and destination record counts."
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "does-a-new-live-form-submission-appear-in-zap-history",
          "ask": "Does a new live form submission appear in Zap history?",
          "answers": [
            {
              "label": "No, history empty",
              "result": "fit"
            },
            {
              "label": "Yes, run fails in Salesforce",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "do-you-own-the-page-and-have-lead-access-for-this-form",
          "ask": "Do you own the Page and have lead access for this form?",
          "answers": [
            {
              "label": "Yes, authorised",
              "result": "fit"
            },
            {
              "label": "No, access is absent",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-use-a-fake-lead-via-meta-s-test-tool",
          "ask": "Can you use a fake lead via Meta’s test tool?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, only customer leads",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "zapier-facebook-leads-to-salesforce",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/zapier-facebook-leads-to-salesforce/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=zapier-facebook-leads-to-salesforce&source=%2Fservices%2Fzapier-facebook-leads-to-salesforce%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=zapier-facebook-leads-to-salesforce&body=SI-Outcome%3A%20zapier-facebook-leads-to-salesforce%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fzapier-facebook-leads-to-salesforce%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    },
    {
      "id": "zapier-sheets-to-xero-missing-columns",
      "url": "https://syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
      "name": "Send every mapped Google Sheets invoice field to Xero",
      "summary": "One disposable row with the agreed columns makes one draft Xero invoice containing every agreed line item and amount.",
      "level": "atomic",
      "category": "integrate",
      "buyer_type": "owner-without-developer",
      "technology": [
        "zapier",
        "google-sheets",
        "xero"
      ],
      "version": "2026-10-09",
      "lifecycle": "candidate",
      "sale": {
        "mode": "enquiry",
        "cta": "Enquire — £145 fixed price"
      },
      "price": {
        "model": "fixed",
        "amount": 145,
        "currency": "GBP",
        "period": null,
        "payment": "After the agreed test passes and you sign off; no payment before sign-off.",
        "tested": false
      },
      "term": {
        "kind": "one_off",
        "extension": "Discuss periodic synthetic mapping and duplicate checks when spreadsheet columns or invoice rules change."
      },
      "result": "One disposable row with the agreed columns makes one draft Xero invoice containing every agreed line item and amount.",
      "includes": [
        "Repair field mapping from one already-working Google Sheets trigger into one Xero draft-invoice action",
        "Remap up to five named columns/line items and verify a single test row"
      ],
      "excludes": [
        "Sending final invoices to real customers",
        "Fixing Xero tax configuration or historical invoices",
        "Converting an entire workbook into accounting software",
        "Rebuilding every Zap in the account",
        "Repairing a trigger that does not start or receive the source row"
      ],
      "eligibility": [
        "Owner controls the Zap, Sheet and Xero organisation",
        "A test row with fake contact and five mapped fields is available",
        "The existing trigger already receives new rows; this job repairs missing field mapping, not a trigger that never starts."
      ],
      "stop_conditions": [
        "Xero API account lacks permission to create a draft",
        "The owner expects a many-to-many product catalogue transformation rather than five mapped fields"
      ],
      "inputs": {
        "initial": [
          "Redacted screenshot of Zap trigger test and missing Xero columns",
          "Headers and example dummy row, without contacts or bank data"
        ],
        "after_agreement": [
          "Owner-owned test Sheet and Xero demo/test organisation",
          "Scoped Zap editing invitation after agreement",
          "A company-controlled secure handoff agreed before access: no live passwords, keys, private code or customer records by ordinary email."
        ]
      },
      "acceptance": [
        {
          "check": "One disposable Sheet row creates exactly one Xero draft invoice with all five agreed mapped values",
          "evidence": "Sheet row and Xero draft screenshot with dummy details"
        },
        {
          "check": "Running the same test event again does not create a second draft without a new source row",
          "evidence": "Zap run history and Xero draft count"
        }
      ],
      "components": [],
      "part_of": [],
      "completion": null,
      "responsibility": null,
      "evidence_delivered": null,
      "eligibility_check": [
        {
          "id": "does-the-zap-trigger-on-a-new-sheet-row",
          "ask": "Does the Zap trigger on a new Sheet row?",
          "answers": [
            {
              "label": "Yes, Zap runs",
              "result": "fit"
            },
            {
              "label": "No, no run in history",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "can-you-make-a-disposable-row-and-draft-invoice-with-fake-details",
          "ask": "Can you make a disposable row and draft invoice with fake details?",
          "answers": [
            {
              "label": "Yes",
              "result": "fit"
            },
            {
              "label": "No, live invoices only",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        },
        {
          "id": "are-five-or-fewer-fields-or-line-items-missing",
          "ask": "Are five or fewer fields or line items missing?",
          "answers": [
            {
              "label": "Yes, bounded set",
              "result": "fit"
            },
            {
              "label": "No, many variable rows",
              "result": "stop"
            },
            {
              "label": "Not sure",
              "result": "check"
            }
          ]
        }
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "zapier-sheets-to-xero-missing-columns",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/services/zapier-sheets-to-xero-missing-columns/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=zapier-sheets-to-xero-missing-columns&source=%2Fservices%2Fzapier-sheets-to-xero-missing-columns%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=zapier-sheets-to-xero-missing-columns&body=SI-Outcome%3A%20zapier-sheets-to-xero-missing-columns%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fservices%2Fzapier-sheets-to-xero-missing-columns%2F%0ASI-Ref%3A%20unknown%0A%0AName%3A%0ACompany%3A%0AWhat%20you%20need%3A%0ASoftware%20or%20systems%3A%0AContext%20link%20(optional)%3A%0AContact%20email%3A%0A%0APlease%20leave%20out%20passwords%2C%20keys%2C%20recovery%20links%2C%20confidential%20code%20and%20customer%20data.",
        "stored": "Only after the visitor sends the email and it reaches our mailbox; composing is not submitting.",
        "mode": "request"
      }
    }
  ]
}
