{
  "schema": "si-demand-engine/1",
  "publication": "candidate; independent approval and deployment are separate",
  "origin": "https://syntheticindustry.ai",
  "records": [
    {
      "id": "bubble-company-seat-limit-signup",
      "type": "outcome",
      "title": "Stop a Bubble signup from adding users beyond a seat limit",
      "description": "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.",
      "url": "/services/bubble-company-seat-limit-signup/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "bubble"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "buyer-business-owner-without-developer"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "composed",
      "title": "Clear a defined backlog of bugs and small engineering tasks",
      "description": "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.",
      "url": "/services/clear-engineering-backlog/",
      "updated": "2026-10-10",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "web-applications",
        "github"
      ],
      "related": [
        "vibe-engineering-lane"
      ],
      "provenance": [
        {
          "label": "The Owner's commercial direction names 'clear this bug backlog' as the example of a project level outcome, bought as a completed result rather than as individual tickets.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "operate-software-engineering",
        "vibe-engineering-lane",
        "buyer-engineering-manager-backlog"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Convert one small CodeIgniter 3 app to CodeIgniter 4",
      "description": "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.",
      "url": "/services/codeigniter-3-app-to-codeigniter-4/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "codeigniter",
        "php",
        "mysql"
      ],
      "related": [
        "php-7-site-to-php-8"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "buyer-business-owner-without-developer"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Keep a Django site responsive during a long data import",
      "description": "One agreed sample import is queued and reports a completed or failed result without a 502; ordinary pages stay responsive on a test copy.",
      "url": "/services/django-import-causes-502/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "django",
        "celery",
        "nginx"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "platform-django"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Move a Django 1.11 site off Python 2.7 on a test copy",
      "description": "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.",
      "url": "/services/django-python27-to-supported/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "django",
        "python"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "platform-django",
        "guide-django-incremental-upgrade"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Move your domain’s DNS with a plan to protect website and email",
      "description": "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.",
      "url": "/services/dns-move-domain-without-email-downtime/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "dns",
        "domains",
        "email",
        "cloudflare"
      ],
      "related": [
        "email-spf-dkim-dmarc-business-mail-in-spam"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "email-spf-dkim-dmarc-business-mail-in-spam",
        "hosting-custom-php-site-off-cpanel",
        "ssl-certificate-expired-not-secure",
        "guide-dns-migration-email"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Move up to five cPanel mailboxes to Microsoft 365",
      "description": "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.",
      "url": "/services/email-move-cpanel-mailboxes-to-microsoft-365/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "email",
        "cpanel",
        "microsoft-365",
        "dns"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-imap-mailbox-migration",
        "buyer-business-owner-without-developer",
        "guide-dns-migration-email"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Set up SPF, DKIM and DMARC for business mail going to spam",
      "description": "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.",
      "url": "/services/email-spf-dkim-dmarc-business-mail-in-spam/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "dns",
        "email",
        "spf",
        "dkim",
        "dmarc"
      ],
      "related": [
        "php-contact-form-emails-not-arriving",
        "dns-move-domain-without-email-downtime"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "dns-move-domain-without-email-downtime",
        "php-contact-form-emails-not-arriving",
        "guide-contact-form-delivery-boundaries",
        "guide-dns-migration-email",
        "guide-email-authentication"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Fix one failing GitHub Actions job and show a green run",
      "description": "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.",
      "url": "/services/fix-failing-github-actions-job/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "github-actions",
        "github"
      ],
      "related": [
        "fix-one-bug-with-regression-test",
        "ship-one-feature-with-running-preview",
        "nextjs-vercel-build-fails"
      ],
      "provenance": [
        {
          "label": "A GitHub Community post reports an Actions failure while the tests succeed locally. It is a community failure report, not a request to pay or evidence of our delivery.",
          "url": "https://github.com/orgs/community/discussions/24938",
          "checked": "2026-10-09"
        },
        {
          "label": "GitHub documents inspecting failed steps and downloading workflow run logs, which supports the before and after log handover.",
          "url": "https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/using-workflow-run-logs"
        },
        {
          "label": "GitHub documents that pull_request runs test a merge revision and that fork-triggered workflows do not receive ordinary secrets. A different event or privilege context is not an equivalent acceptance run.",
          "url": "https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows"
        },
        {
          "label": "DSNCON advertises a EUR 49 live pipeline-fix screen-share session; the offer's precise platform scope and VAT treatment are unstated. This is a competing ask, not a paid price.",
          "url": "https://www.dsncon.com/kb/en/git-cicd-fix",
          "checked": "2026-10-09"
        }
      ],
      "incoming": [
        "clear-engineering-backlog",
        "fix-one-bug-with-regression-test",
        "keep-github-actions-ci-green",
        "ship-one-feature-with-running-preview",
        "buyer-engineering-manager-backlog",
        "platform-github-actions",
        "guide-github-actions-first-failure",
        "guide-github-actions-local-pass-ci-fail",
        "example-ci-repair-evidence"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Fix one reproducible bug with a failing-then-passing regression test",
      "description": "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.",
      "url": "/services/fix-one-bug-with-regression-test/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "web-application",
        "automated-tests",
        "git",
        "github-actions"
      ],
      "related": [
        "fix-failing-github-actions-job",
        "ship-one-feature-with-running-preview",
        "nextjs-vercel-build-fails"
      ],
      "provenance": [
        {
          "label": "A public GitHub community guide asks for the minimum code that reliably demonstrates an issue and encourages test cases and fixes through pull requests. It is guidance, not a buyer request or payment.",
          "url": "https://gist.github.com/Rich-Harris/88c5fc2ac6dc941b22e7996af05d70ff",
          "checked": "2026-10-09"
        },
        {
          "label": "Unlimited Dev advertises its GBP 995/month Web plan with one active request and bug fixes included. This is a subscription ask, not a matched price paid for one regression-test repair.",
          "url": "https://www.unlimiteddev.io/",
          "checked": "2026-10-09"
        },
        {
          "label": "Avastu.dev advertises EUR 3,995/month for its Monthly Club with one request at a time and lists Bug Fixes. This is a subscription seller ask, not paid demand evidence.",
          "url": "https://avastu.dev/",
          "checked": "2026-10-09"
        }
      ],
      "incoming": [
        "clear-engineering-backlog",
        "fix-failing-github-actions-job",
        "ship-one-feature-with-running-preview",
        "vibe-engineering-lane",
        "buyer-engineering-manager-backlog",
        "platform-github-actions",
        "guide-github-actions-local-pass-ci-fail"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Move a custom PHP site and its database off shared cPanel hosting",
      "description": "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.",
      "url": "/services/hosting-custom-php-site-off-cpanel/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "php",
        "mysql",
        "cpanel",
        "hosting"
      ],
      "related": [
        "dns-move-domain-without-email-downtime",
        "php-7-site-to-php-8"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-backup-restore-evidence",
        "example-migration-acceptance-packet",
        "buyer-business-owner-without-developer",
        "guide-certificate-expiry-renewal",
        "platform-php",
        "tool-migration-readiness"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Bring back a website after its hosting server runs out of disk space",
      "description": "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.",
      "url": "/services/hosting-disk-full-website-down/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "hosting",
        "linux",
        "mysql"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-hosting-disk-full"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Set up off-site backups for a website and prove a restore works",
      "description": "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.",
      "url": "/services/hosting-offsite-backups-with-restore-test/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "hosting",
        "backup",
        "mysql",
        "django",
        "wordpress-woocommerce"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-backup-restore-evidence",
        "guide-hosting-disk-full",
        "platform-django",
        "platform-wordpress-woocommerce",
        "guide-wordpress-critical-error-triage"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "recurring",
      "title": "Keep your GitHub Actions CI green, month after month",
      "description": "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.",
      "url": "/services/keep-github-actions-ci-green/",
      "updated": "2026-10-10",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "github-actions",
        "github"
      ],
      "related": [
        "vibe-engineering-lane"
      ],
      "provenance": [
        {
          "label": "The Owner's commercial direction lists 'keep our CI green' as a standing outcome that can be sold alone, inside an engineering lane, or composed into larger responsibilities.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "vibe-engineering-lane",
        "platform-github-actions",
        "example-ci-repair-evidence"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Upgrade one Laravel 6–10 app with its key business flows tested",
      "description": "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.",
      "url": "/services/laravel-old-app-to-supported-version/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "laravel",
        "php",
        "mysql"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "platform-laravel"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Restart a Laravel job queue that stopped sending business emails",
      "description": "Find why a Laravel queue stopped processing one named email or notification job, repair it on staging, and add a failed-job alert.",
      "url": "/services/laravel-queue-emails-stopped-sending/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "laravel",
        "php",
        "queue"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-contact-form-delivery-boundaries",
        "platform-laravel",
        "guide-laravel-queue-email-stopped"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Fix a Next.js build that works locally but fails on Vercel",
      "description": "The same commit builds on a Vercel preview and its named page loads there without introducing a secret into source control.",
      "url": "/services/nextjs-vercel-build-fails/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "nextjs",
        "vercel"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "fix-failing-github-actions-job",
        "fix-one-bug-with-regression-test",
        "ship-one-feature-with-running-preview",
        "guide-nextjs-vercel-production-build",
        "guide-github-actions-local-pass-ci-fail"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "composed",
      "title": "Operate software engineering for your company",
      "description": "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.",
      "url": "/services/operate-software-engineering/",
      "updated": "2026-10-10",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "web-applications",
        "github"
      ],
      "related": [
        "vibe-engineering-lane"
      ],
      "provenance": [
        {
          "label": "The Owner's commercial direction names operating software engineering for a company as the highest level of the outcome ladder, to be built on smaller outcomes as demand justifies it.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "vibe-engineering-lane",
        "buyer-engineering-manager-backlog"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Keep an old PHP website running when your host moves it to PHP 8",
      "description": "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.",
      "url": "/services/php-7-site-to-php-8/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "php",
        "mysql"
      ],
      "related": [
        "wordpress-critical-error-after-update"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "codeigniter-3-app-to-codeigniter-4",
        "hosting-custom-php-site-off-cpanel",
        "php-contact-form-emails-not-arriving",
        "platform-php",
        "guide-php8-compatibility-checklist",
        "guide-wordpress-critical-error-triage"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Make your website's contact or booking form emails arrive again",
      "description": "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.",
      "url": "/services/php-contact-form-emails-not-arriving/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "php",
        "laravel",
        "smtp",
        "email"
      ],
      "related": [
        "email-spf-dkim-dmarc-business-mail-in-spam",
        "php-7-site-to-php-8"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "email-spf-dkim-dmarc-business-mail-in-spam",
        "guide-contact-form-delivery-boundaries",
        "buyer-business-owner-without-developer",
        "platform-php",
        "guide-laravel-queue-email-stopped",
        "guide-email-authentication"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Fix “undefined function mysql_connect” on an old PHP website",
      "description": "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.",
      "url": "/services/php-mysql-connect-error-database-repair/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "php",
        "mysql"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "platform-php",
        "guide-php-mysql-extension-repair",
        "guide-php8-compatibility-checklist"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Add one small web-app feature you can try in a private preview",
      "description": "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.",
      "url": "/services/ship-one-feature-with-running-preview/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "web-application",
        "git",
        "preview-environment"
      ],
      "related": [
        "fix-failing-github-actions-job",
        "fix-one-bug-with-regression-test",
        "nextjs-vercel-build-fails"
      ],
      "provenance": [
        {
          "label": "A public GitHub issue requests a running preview so a product owner can manually verify changes before merge. It is a community feature request, not evidence of a buyer offering payment.",
          "url": "https://github.com/maksimp6/Chat/issues/199",
          "checked": "2026-10-09"
        },
        {
          "label": "Vercel documents separate access-protection methods for preview URLs. A preview URL alone does not establish private access; the service still needs a verified protection method on its agreed host.",
          "url": "https://vercel.com/docs/deployment-protection"
        },
        {
          "label": "Render documents disposable preview copies and expiry configuration, with no expiry by default and resources billed separately. Preview isolation and teardown must be configured rather than assumed; this service does not require or include a Render subscription.",
          "url": "https://render.com/docs/preview-environments"
        },
        {
          "label": "Unlimited Dev advertises a GBP 995/month Web plan with one active web request. The page does not state private-preview terms; this is a subscription ask, not a fee paid for this feature scope.",
          "url": "https://www.unlimiteddev.io/",
          "checked": "2026-10-09"
        },
        {
          "label": "Avastu.dev advertises EUR 3,995/month for one development request at a time. This is a subscription seller ask rather than paid demand evidence for a single feature with a private preview.",
          "url": "https://avastu.dev/",
          "checked": "2026-10-09"
        }
      ],
      "incoming": [
        "clear-engineering-backlog",
        "fix-failing-github-actions-job",
        "fix-one-bug-with-regression-test",
        "vibe-engineering-lane",
        "example-shopping-list-evidence",
        "guide-nextjs-vercel-production-build"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Fix Shopify products rejected for missing brand identifiers",
      "description": "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.",
      "url": "/services/shopify-merchant-brand-identifier/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "shopify",
        "google-merchant-center"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-merchant-brand-identifiers",
        "platform-shopify"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Restore a Shopify product tab lost after a theme update",
      "description": "The agreed product-description tab opens and closes on a duplicated theme on phone and desktop while the underlying product text remains unchanged.",
      "url": "/services/shopify-product-tab-after-theme-update/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "shopify",
        "liquid",
        "javascript"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "shopify-uninstalled-review-app-residue",
        "buyer-ecommerce-owner-checkout",
        "guide-shopify-theme-update-regression",
        "platform-shopify"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Remove leftover Shopify review-app code from one product template",
      "description": "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.",
      "url": "/services/shopify-uninstalled-review-app-residue/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "shopify",
        "liquid"
      ],
      "related": [
        "shopify-product-tab-after-theme-update"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-shopify-app-uninstall-cleanup",
        "platform-shopify"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Clear the “Not secure” warning after your site's certificate expired",
      "description": "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.",
      "url": "/services/ssl-certificate-expired-not-secure/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "ssl",
        "https",
        "lets-encrypt",
        "dns"
      ],
      "related": [
        "dns-move-domain-without-email-downtime"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-certificate-expiry-renewal"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Restore paid member access after Stripe takes a payment",
      "description": "One agreed test purchase activates exactly the intended membership tier on a test account; a failed payment activates nothing.",
      "url": "/services/stripe-memberstack-access-after-payment/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "stripe",
        "memberstack",
        "webflow"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "stripe-nextjs-supabase-subscriptions",
        "platform-stripe",
        "guide-stripe-webhook-delivery",
        "guide-stripe-subscription-access"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Add monthly and yearly Stripe plans to a Next.js app",
      "description": "One test account can buy, renew and cancel the agreed plan; Supabase reflects the correct current access state without duplicate subscriptions.",
      "url": "/services/stripe-nextjs-supabase-subscriptions/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "stripe",
        "nextjs",
        "supabase"
      ],
      "related": [
        "stripe-memberstack-access-after-payment"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "guide-nextjs-vercel-production-build",
        "platform-stripe",
        "guide-stripe-webhook-delivery",
        "guide-stripe-subscription-access",
        "example-stripe-event-replay-matrix"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "composed",
      "title": "Your next feature. Working, not just written.",
      "description": "A managed engineering lane for founders and product leaders with an existing product and a continuing backlog. Describe the result. Inspect a running preview. Accept it or tell us what needs to change.",
      "url": "/vibe-engineering/",
      "updated": "2026-10-10",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "web-applications",
        "github"
      ],
      "related": [
        "operate-software-engineering"
      ],
      "provenance": [
        {
          "label": "The retained independently reviewed premium page proposes US$10,000/month, one product, one active item and up to four scoped monthly items as a ceiling, not guaranteed completions. It does not require the buyer to operate GitHub; live release and terms require agreement.",
          "path": "drafts/2026-10-09-commercial-release/assembled-site/vibe-engineering/index.html",
          "checked": "2026-10-10"
        },
        {
          "label": "The Owner's immediate direction retains the approximately US$10,000/month lane as a pricing hypothesis while making the software/business-outcomes demand engine the priority.",
          "path": "charter/demand-engine-2026-10-10.md",
          "checked": "2026-10-10"
        }
      ],
      "incoming": [
        "clear-engineering-backlog",
        "keep-github-actions-ci-green",
        "operate-software-engineering",
        "example-shopping-list-evidence",
        "buyer-business-owner-without-developer",
        "buyer-engineering-manager-backlog"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Fix a WooCommerce checkout that broke after an update",
      "description": "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.",
      "url": "/services/woocommerce-checkout-after-update/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "woocommerce",
        "wordpress",
        "php",
        "wordpress-woocommerce"
      ],
      "related": [
        "wordpress-critical-error-after-update"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "wordpress-critical-error-after-update",
        "buyer-ecommerce-owner-checkout",
        "platform-wordpress-woocommerce",
        "guide-woocommerce-checkout-conflicts"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Bring back a WordPress site showing a critical error or HTTP 500",
      "description": "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.",
      "url": "/services/wordpress-critical-error-after-update/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "wordpress",
        "php",
        "wordpress-woocommerce"
      ],
      "related": [
        "woocommerce-checkout-after-update"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "php-7-site-to-php-8",
        "woocommerce-checkout-after-update",
        "guide-php8-compatibility-checklist",
        "platform-wordpress-woocommerce",
        "guide-wordpress-critical-error-triage"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Make new Facebook leads appear in Salesforce again",
      "description": "A new synthetic lead submitted to the agreed Facebook form starts one Zap and creates one Salesforce test lead with the agreed fields.",
      "url": "/services/zapier-facebook-leads-to-salesforce/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "zapier",
        "facebook-lead-ads",
        "salesforce"
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns"
      ],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping",
        "tool-workflow-value"
      ],
      "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."
      },
      "outcome": {
        "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",
      "type": "outcome",
      "title": "Send every mapped Google Sheets invoice field to Xero",
      "description": "One disposable row with the agreed columns makes one draft Xero invoice containing every agreed line item and amount.",
      "url": "/services/zapier-sheets-to-xero-missing-columns/",
      "updated": "2026-10-09",
      "version": 1,
      "lifecycle": "candidate",
      "platforms": [
        "zapier",
        "google-sheets",
        "xero"
      ],
      "related": [],
      "provenance": [
        {
          "label": "Commercial hypothesis for this bounded outcome, not verified buyer demand or a tested price. The 9 October direction permits reasonable offers without inventing prior sales. Earlier unverified marketplace and community quotations are not used in this release.",
          "path": "charter/commercial-direction-2026-10-09.md"
        }
      ],
      "incoming": [
        "zapier-facebook-leads-to-salesforce",
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping",
        "tool-workflow-value"
      ],
      "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."
      },
      "outcome": {
        "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"
        }
      }
    },
    {
      "id": "buyer-ecommerce-owner-checkout",
      "type": "buyer",
      "title": "For an ecommerce owner: restore the buying journey without experimenting on live orders",
      "description": "Specify the checkout that fails, preserve payment safety and judge a repair by a completed synthetic order rather than a screenshot.",
      "slug": "ecommerce-owner-checkout",
      "url": "/buyers/ecommerce-owner-checkout/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "WooCommerce: conflict testing",
          "url": "https://woocommerce.com/document/how-to-test-for-conflicts/",
          "checked": "2026-10-10",
          "claims": [
            "Backup and staging protect the store during conflict testing."
          ]
        },
        {
          "label": "Shopify: theme updates",
          "url": "https://help.shopify.com/en/manual/online-store/themes/managing-themes/updating-themes",
          "checked": "2026-10-10",
          "claims": [
            "Updated themes are drafts that need review before publication."
          ]
        }
      ],
      "related": [
        "woocommerce-checkout-after-update",
        "guide-woocommerce-checkout-conflicts",
        "shopify-product-tab-after-theme-update",
        "platform-shopify",
        "guide-merchant-brand-identifiers"
      ],
      "sections": [
        {
          "heading": "Tell us where the buyer stops",
          "body": [
            "Describe the product, device, shipping choice and payment method involved. A missing product tab, a missing shipping rate and a rejected payment are different failures. Say whether every shopper is affected or only one combination. Do not estimate lost sales from unmeasured traffic or a guessed conversion rate."
          ],
          "items": [
            "Keep public screenshots and a redacted error.",
            "Record the update or app change before the failure.",
            "Do not send real order records or customer payment details."
          ]
        },
        {
          "heading": "A store copy needs explicit isolation",
          "body": [
            "A staging copy can inherit live gateways, emails and fulfilment hooks. Agree who disables external effects and supplies synthetic products, customers and test payment settings. The objective is to reproduce the real buying journey safely, not generate a live sale during diagnosis."
          ],
          "items": [
            "Name who owns the payment and store accounts.",
            "Keep a restore point and known prior theme or plugin state.",
            "Do not deactivate essential live checkout components without an authorised plan."
          ]
        },
        {
          "heading": "What the owner should inspect",
          "body": [
            "For a checkout repair, inspect the same agreed product-to-confirmation journey, expected totals, order creation and status. For a product-page repair, inspect the affected feature plus an unaffected product. The handover should include cause, evidence, changed settings and reversal. An isolated successful test does not establish site-wide conversion uplift."
          ],
          "items": [
            "Accept the specific result, not an unexplained green badge.",
            "Approve the live route separately; no account control transfers through an enquiry."
          ]
        },
        {
          "heading": "Start with the smallest useful request",
          "body": [
            "Send the platform, broken step, timing and redacted symptom. Scope and price are confirmed before private access or work. If several business paths are broken, ask for a coordinated scope rather than buying unrelated fixes that cannot be safely tested together."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-merchant-brand-identifiers",
        "guide-woocommerce-checkout-conflicts"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/buyers/ecommerce-owner-checkout/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fbuyers%2Fecommerce-owner-checkout%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fbuyers%2Fecommerce-owner-checkout%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."
      }
    },
    {
      "id": "guide-imap-mailbox-migration",
      "type": "guide",
      "title": "Move IMAP mailboxes to Microsoft 365: what moves and what does not",
      "description": "Plan existing-mail verification separately from new-mail routing, contacts, calendars and the safe handling of mailbox access.",
      "slug": "imap-mailbox-migration",
      "url": "/guides/imap-mailbox-migration/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Microsoft: IMAP migration",
          "url": "https://learn.microsoft.com/en-us/exchange/mailbox-migration/migrating-imap-mailboxes/migrating-imap-mailboxes",
          "checked": "2026-10-10",
          "claims": [
            "IMAP migration moves mail folders, not contacts, calendar items or tasks.",
            "Destination mailboxes must exist and be licensed.",
            "Microsoft documents a 500000-item maximum and 35MB message limit.",
            "Verify migration and new routing before stopping synchronisation."
          ]
        }
      ],
      "related": [
        "email-move-cpanel-mailboxes-to-microsoft-365",
        "guide-dns-migration-email",
        "guide-email-authentication",
        "buyer-business-owner-without-developer"
      ],
      "sections": [
        {
          "heading": "Define the content inventory",
          "body": [
            "IMAP migration concerns inbox and other mail folders. Microsoft says it does not migrate contacts, calendar entries or tasks. Inventory those separately, along with local-only archives and shared-mailbox needs. The published tool limits are up to 500,000 items per mailbox and 35 MB per message; identify exceptions before promising complete transfer."
          ],
          "items": [
            "Record mailbox counts and approximate sizes without exporting message contents.",
            "Check whether retention or archive policies affect verification.",
            "Create and license the intended destination mailboxes before migrating."
          ]
        },
        {
          "heading": "Access cannot be solved by emailing a password list",
          "body": [
            "Microsoft's migration procedure requires authorised access to source mailboxes. That is an administrator-controlled requirement, not an invitation to send passwords or migration CSVs to an enquiry or agent. Agree a secure owner-held execution route and data boundaries before accepting work; if unavailable, migration cannot simply proceed."
          ],
          "items": [
            "Do not attach a mailbox export, password CSV or staff directory initially.",
            "Name the authorised tenant and source-mail administrator.",
            "Agree user communication and any password impact before changes."
          ]
        },
        {
          "heading": "Old mail and new routing are different checks",
          "body": [
            "Verify copied mail folders and any exceptions before changing MX routing. After the approved cutover, verify new mail reaches the destination and that required sending paths work. Microsoft places routing verification before stopping synchronisation. A successful login to one new mailbox does not prove that old messages or every address are correct."
          ],
          "items": [
            "Retain the source until the agreed verification and recovery boundary.",
            "Account for aliases and authorised senders in the DNS/authentication plan."
          ]
        },
        {
          "heading": "Scope and evidence",
          "body": [
            "A credible proposal lists included mailboxes, excluded data types, size exceptions, verification criteria and who performs the authorised account changes. Send providers and approximate counts initially. Exact private inventories and access remain gated; no zero-loss or zero-downtime guarantee follows from this guide."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-dns-migration-email"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/imap-mailbox-migration/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fimap-mailbox-migration%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fimap-mailbox-migration%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."
      }
    },
    {
      "id": "guide-contact-form-delivery-boundaries",
      "type": "guide",
      "title": "Contact form says sent, but no email arrives: trace the delivery boundaries",
      "description": "Distinguish form submission, mail-system acceptance and recipient delivery before changing DNS or sending repeated test messages.",
      "slug": "contact-form-delivery-boundaries",
      "url": "/guides/contact-form-delivery-boundaries/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "PHP: mail function",
          "url": "https://www.php.net/manual/en/function.mail.php",
          "checked": "2026-10-10",
          "claims": [
            "A true mail() return means accepted for delivery, not guaranteed receipt.",
            "Outside data used in headers must be sanitised to avoid header injection."
          ]
        },
        {
          "label": "Microsoft: email authentication",
          "url": "https://learn.microsoft.com/en-us/defender-office-365/email-authentication-about",
          "checked": "2026-10-10",
          "claims": [
            "Authentication does not guarantee destination delivery."
          ]
        }
      ],
      "related": [
        "php-contact-form-emails-not-arriving",
        "email-spf-dkim-dmarc-business-mail-in-spam",
        "guide-email-authentication",
        "laravel-queue-emails-stopped-sending"
      ],
      "sections": [
        {
          "heading": "A success message may prove only the first boundary",
          "body": [
            "A browser can report submission success before a background job or mail server completes delivery. PHP explicitly says mail() returning true means accepted for delivery, not that it reached the recipient. Separate the form request, application processing, provider acceptance and destination result."
          ],
          "items": [
            "Use one agreed synthetic submission with a traceable identifier.",
            "Check existing application and provider errors with the account holder.",
            "Inspect the controlled recipient's spam folder and redacted headers without exporting customer messages."
          ]
        },
        {
          "heading": "Check identity and transport independently",
          "body": [
            "Confirm the configured sender and recipient without sharing secrets. A website, mailbox host and transactional provider may differ. Authentication records should match the actual authorised sender; adding arbitrary SPF or DKIM values is not a general mail repair. A queue failure needs worker evidence, while a provider rejection needs its redacted response."
          ],
          "items": [
            "Do not use the visitor's address as an untrusted From header.",
            "Review header input sanitisation; PHP warns about injected headers.",
            "Use a fixed permitted sender and an agreed reply path."
          ]
        },
        {
          "heading": "Testing can send real mail",
          "body": [
            "Only use a recipient and test route approved by the account holder. Repeated form submissions can create bookings, CRM records or notifications even when no email appears. Isolate those effects and verify whether the earlier request already created a record before retrying it."
          ],
          "items": [
            "No passwords, SMTP keys or message contents in a first enquiry.",
            "Do not add debug output to the public form.",
            "Check that invalid or incomplete inputs fail safely."
          ]
        },
        {
          "heading": "Acceptance result",
          "body": [
            "One synthetic request should reach the agreed controlled destination with the expected fields, and the application should expose a controlled failure when transport is unavailable. Keep identifiers and redacted results at each boundary. This tests the named form flow, not guaranteed inbox placement for every future recipient."
          ],
          "items": []
        }
      ],
      "incoming": [
        "buyer-business-owner-without-developer",
        "guide-laravel-queue-email-stopped",
        "guide-email-authentication"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/contact-form-delivery-boundaries/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fcontact-form-delivery-boundaries%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fcontact-form-delivery-boundaries%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."
      }
    },
    {
      "id": "guide-backup-restore-evidence",
      "type": "guide",
      "title": "A backup file is not proof of recovery: define and test a restore",
      "description": "Check database, uploaded files, roles and application behaviour in an isolated restoration rather than trusting a scheduled success message.",
      "slug": "backup-restore-evidence",
      "url": "/guides/backup-restore-evidence/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "PostgreSQL: SQL dump backup",
          "url": "https://www.postgresql.org/docs/current/backup-dump.html",
          "checked": "2026-10-10",
          "claims": [
            "pg_dump backs up one database with an internally consistent snapshot.",
            "Cluster-wide roles and tablespaces are not included in an ordinary pg_dump.",
            "Restore tooling depends on dump format; SQL restoration can continue after errors unless configured otherwise."
          ]
        },
        {
          "label": "Django: deployment checklist",
          "url": "https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/",
          "checked": "2026-10-10",
          "claims": [
            "Database and user-uploaded media both need backup strategies."
          ]
        }
      ],
      "related": [
        "hosting-offsite-backups-with-restore-test",
        "hosting-custom-php-site-off-cpanel",
        "platform-django",
        "example-migration-acceptance-packet",
        "tool-migration-readiness"
      ],
      "sections": [
        {
          "heading": "Inventory what must be recovered",
          "body": [
            "List the database, uploaded media, necessary code/configuration and external dependencies. A database-only backup cannot recover files stored elsewhere. Name the required recovery point and acceptable interruption as customer decisions, not guessed numbers. Record who can perform a restore through an approved route."
          ],
          "items": [
            "Keep backup storage independent of the failure you are protecting against.",
            "Review permissions, encryption and retention without putting keys in the repository.",
            "Do not send production backups to an agent as a first enquiry."
          ]
        },
        {
          "heading": "Match the restore to the backup",
          "body": [
            "PostgreSQL distinguishes plain SQL dumps from archive formats restored with pg_restore. A normal pg_dump covers one database, not cluster-wide roles or tablespaces. Missing roles can affect ownership and grants. Check tool versions, extensions and the intended target before treating a file as a portable whole-system recovery."
          ],
          "items": [
            "Use only trusted backup material; restoring it can execute database instructions.",
            "Stop and record restore errors rather than counting a partially loaded database as success."
          ]
        },
        {
          "heading": "Prove recovery on an isolated destination",
          "body": [
            "Restore through the authorised operator into a disposable destination with external mail, payments and integrations disabled. Inspect expected records, required files and a small set of business flows. A success exit code is useful but insufficient if the application cannot authenticate, locate uploads or perform its agreed write path."
          ],
          "items": [
            "Keep the backup ID, timestamp, restoration result and exceptions.",
            "Test with permitted synthetic or approved non-sensitive evidence.",
            "Do not overwrite the live database to prove the backup works."
          ]
        },
        {
          "heading": "What the handover says",
          "body": [
            "Name exactly what was restored, what was not tested and how the operator repeats the procedure. No restore-time guarantee is established without measurement. For a backup setup enquiry, send platform and storage boundaries, not dump contents or storage credentials."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-migration-acceptance-packet",
        "guide-hosting-disk-full",
        "tool-migration-readiness"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/backup-restore-evidence/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fbackup-restore-evidence%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fbackup-restore-evidence%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."
      }
    },
    {
      "id": "example-migration-acceptance-packet",
      "type": "example",
      "title": "Example acceptance packet for an application migration",
      "description": "A synthetic outline connecting business checks, restore evidence and the live-write boundary; no migration or customer delivery is claimed.",
      "slug": "migration-acceptance-packet",
      "url": "/examples/migration-acceptance-packet/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Django: deployment checklist",
          "url": "https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/",
          "checked": "2026-10-10",
          "claims": [
            "Sensitive production settings and database/media backups require review."
          ]
        },
        {
          "label": "PostgreSQL: dump and restore",
          "url": "https://www.postgresql.org/docs/current/backup-dump.html",
          "checked": "2026-10-10",
          "claims": [
            "An ordinary database dump excludes cluster-wide roles and tablespaces."
          ]
        }
      ],
      "related": [
        "guide-backup-restore-evidence",
        "guide-django-incremental-upgrade",
        "hosting-custom-php-site-off-cpanel",
        "tool-migration-readiness"
      ],
      "sections": [
        {
          "heading": "What this example is",
          "body": [
            "This is a synthetic handover outline for moving one small application's test copy to an agreed target. No files were migrated for this example, no timing is measured and no client sign-off exists. It shows the fields that should become real evidence during an authorised delivery."
          ],
          "items": [
            "Request: exact source and target, included application/database/files and excluded external systems.",
            "Baseline: dependency versions and login, read, write and file-access checks on the safe source copy.",
            "Target: matching checks on the new isolated copy with permitted synthetic data."
          ]
        },
        {
          "heading": "Evidence before a live switch",
          "body": [
            "Each named business flow has an expected result and a retained redacted test result. Include the restore rehearsal, required roles/extensions and uploaded-file checks. Identify all external effects that were disabled. A local green build cannot substitute for the agreed target runtime result."
          ],
          "items": [
            "Record changed code, settings and migrations.",
            "Keep independent review findings and dispositions.",
            "Explain every excluded path rather than silently treating it as tested."
          ]
        },
        {
          "heading": "Write boundary and recovery",
          "body": [
            "Name when the source stops accepting writes and when the target starts. Record how the authorised operator would recover if the target fails after receiving new data. Returning code or DNS to the source is not enough if the databases have diverged. If recovery is unresolved, the live switch remains blocked."
          ],
          "items": [
            "Customer approves the cutover and account actions.",
            "Secrets and production backups stay on approved owner-held routes.",
            "Acceptance, invoice and cash receipt are separate records."
          ]
        },
        {
          "heading": "Use it to evaluate a proposal",
          "body": [
            "Ask which checks will prove the business still works and what cannot be reversed automatically. The answer should identify actual boundaries, not merely promise no downtime. A completed packet would contain real run evidence; this example remains an inspectable specification, not a runnable migration fixture."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-backup-restore-evidence",
        "guide-django-incremental-upgrade",
        "tool-migration-readiness"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/examples/migration-acceptance-packet/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Fmigration-acceptance-packet%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fexamples%2Fmigration-acceptance-packet%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."
      }
    },
    {
      "id": "example-shopping-list-evidence",
      "type": "example",
      "asset_kind": "shopping-list",
      "title": "Try a small feature and inspect its real synthetic evidence packet",
      "description": "An existing shopping-list demonstration connects the request, tests and implementation, with explicit limits and no client-delivery claim.",
      "slug": "shopping-list-evidence",
      "url": "/examples/shopping-list-evidence/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Actual list implementation",
          "path": "opportunities/catalogue/samples/lane-demo/after/list.js",
          "checked": "2026-10-10",
          "claims": [
            "The list supports add, toggle, clearing bought items and a remaining counter; state is in memory."
          ]
        },
        {
          "label": "Actual automated tests, rerun 10 October",
          "path": "opportunities/catalogue/samples/lane-demo/after/list.test.js",
          "checked": "2026-10-10",
          "claims": [
            "node --test passed all 16 tests when rerun on 10 October 2026."
          ]
        },
        {
          "label": "Synthetic delivery packet",
          "path": "opportunities/catalogue/samples/lane-demo/packet.json",
          "checked": "2026-10-10",
          "claims": [
            "The request and app are made up, not client work.",
            "A real screen-reader announcement remains untested."
          ]
        },
        {
          "label": "Independent Node/static review",
          "path": "opportunities/catalogue/samples/lane-demo/evidence/independent-review.md",
          "checked": "2026-10-10",
          "claims": [
            "Independent reviewer reproduced 16 passing tests and historical red cases, without browser or pixel review.",
            "Known long unbroken text overflow and low-severity limitations were disclosed."
          ]
        }
      ],
      "related": [
        "ship-one-feature-with-running-preview",
        "vibe-engineering-lane",
        "buyer-engineering-manager-backlog",
        "example-ci-repair-evidence"
      ],
      "sections": [
        {
          "heading": "The made-up request",
          "body": [
            "Add a button to clear bought items and show how many remain. Synthetic Industry built this small app to demonstrate a deliverable and evidence packet, not for a customer. The name 'Shared shopping list' does not imply multiple users: there is no account sharing, server or persistence."
          ],
          "items": [
            "Clearing removes checked items and keeps the others in order.",
            "The remaining counter updates after add, toggle and clear.",
            "An empty list has zero remaining and a disabled clear button."
          ]
        },
        {
          "heading": "What was actually checked",
          "body": [
            "The existing 16 Node tests were rerun on 10 October 2026 and all passed. The retained independent review reproduced those tests and the historical failure when new tests were paired with the old implementation. That review used Node and static inspection, not a browser or screenshots. The packet also retains the author's historical browser-check results; these are distinct from the independent Node/static review."
          ],
          "items": [
            "Inspect the implementation and test file linked in the sources.",
            "Read the packet's review findings and limitations.",
            "The independent reviewer did not establish any client acceptance or production release."
          ]
        },
        {
          "heading": "Try it with disposable text",
          "body": [
            "Add an item, mark one bought and clear bought items. Try the singular, plural and empty counter states. State resets when the page reloads. The demonstration is not intended to store a real shopping list."
          ],
          "items": [
            "Do not type private or customer information.",
            "No email, payment or account action belongs to this example."
          ]
        },
        {
          "heading": "Honest limits",
          "body": [
            "No real screen reader has verified the announcement behaviour. The historical sample disclosed long unbroken item-text overflow, zero-width-space names and a weak immutability assertion; do not treat a small demonstration as a production-ready multi-user app. It shows how a request can be linked to checks, a running result and independent findings, not evidence of client-lane throughput."
          ],
          "items": []
        }
      ],
      "incoming": [
        "buyer-engineering-manager-backlog"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/examples/shopping-list-evidence/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Fshopping-list-evidence%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fexamples%2Fshopping-list-evidence%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."
      }
    },
    {
      "id": "buyer-business-owner-without-developer",
      "type": "buyer",
      "title": "For an owner without a developer: describe the result, not the code change",
      "description": "Identify authority, a testable business flow and safe inputs without making the owner a repository operator or asking for passwords.",
      "slug": "business-owner-without-developer",
      "url": "/buyers/business-owner-without-developer/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "PHP: accepted mail versus delivery",
          "url": "https://www.php.net/manual/en/function.mail.php",
          "checked": "2026-10-10",
          "claims": [
            "A technical success result can differ from the business outcome of received mail."
          ]
        },
        {
          "label": "Microsoft: mailbox migration",
          "url": "https://learn.microsoft.com/en-us/exchange/mailbox-migration/migrating-imap-mailboxes/migrating-imap-mailboxes",
          "checked": "2026-10-10",
          "claims": [
            "Mailbox migration requires authorised source access and destination preparation."
          ]
        }
      ],
      "related": [
        "php-contact-form-emails-not-arriving",
        "email-move-cpanel-mailboxes-to-microsoft-365",
        "hosting-custom-php-site-off-cpanel",
        "codeigniter-3-app-to-codeigniter-4",
        "bubble-company-seat-limit-signup",
        "vibe-engineering-lane",
        "guide-contact-form-delivery-boundaries"
      ],
      "sections": [
        {
          "heading": "Start with one observable result",
          "body": [
            "Describe what a person should be able to do and what happens instead: submit a booking and receive its message, log in and reach a report, or keep old mail while new mail reaches the new service. You do not need to diagnose a framework or specify a pull request. A public link and redacted screenshot often convey the symptom better than guessed technical instructions."
          ],
          "items": [
            "Name the affected flow and when it last worked.",
            "Record the preceding host, app or version change if known.",
            "Say what would count as a successful result you can inspect."
          ]
        },
        {
          "heading": "Authority is different from technical labour",
          "body": [
            "You retain control of the business accounts and approve changes, but that does not mean you must operate GitHub or manage individual coding sessions. The proposed delivery route must name who can safely run the copy, review the work and perform any approved live step. Synthetic Industry resolves its fulfilment route before accepting work; unresolved access is a blocker, not a request for your password."
          ],
          "items": [
            "No credentials, private code or account invitations in first contact.",
            "Identify who owns the software rights and relevant provider accounts."
          ]
        },
        {
          "heading": "Ask for evidence you can use",
          "body": [
            "For UI work, ask for the agreed running flow and relevant screenshots. For a background process, ask for a runnable synthetic example and its expected result. For company-seat signup, specify who may invite users, the permitted seat count, and what happens at the limit; require synthetic below-limit, at-limit and unauthorised-invite checks rather than assuming an account exists means company permissions are correct. These are proposed acceptance checks, not a claim about Bubble's built-in seat limits. The handover should explain changes, checks, review findings and limitations in plain English. A successful command or green badge alone may not prove your business outcome."
          ],
          "items": [
            "Keep acceptance and production approval distinct.",
            "Agree scope and price before any private work or charge."
          ]
        },
        {
          "heading": "When the job becomes larger",
          "body": [
            "A one-off repair is appropriate for a bounded failure. Repeated changes can fit a scoped backlog project or engineering lane after fit is confirmed. Legacy conversion, mailbox migration and a host move have different data and recovery boundaries; do not bundle them into an assumed small fix without a written scope."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-imap-mailbox-migration"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/buyers/business-owner-without-developer/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fbuyers%2Fbusiness-owner-without-developer%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fbuyers%2Fbusiness-owner-without-developer%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."
      }
    },
    {
      "id": "buyer-engineering-manager-backlog",
      "type": "buyer",
      "title": "For an engineering manager: turn backlog items into independently verifiable outcomes",
      "description": "Separate maintenance, genuine bug fixes and feature slices; keep acceptance, capacity and release gates visible across a delivery lane.",
      "slug": "engineering-manager-backlog",
      "url": "/buyers/engineering-manager-backlog/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "GitHub: run identity and logs",
          "url": "https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/using-workflow-run-logs",
          "checked": "2026-10-10",
          "claims": [
            "Named jobs and run logs provide inspectable CI evidence."
          ]
        },
        {
          "label": "Real synthetic delivery packet",
          "path": "opportunities/catalogue/samples/lane-demo/packet.json",
          "checked": "2026-10-10",
          "claims": [
            "The sample connects acceptance criteria, implementation, tests, review and limitations; it is not client work."
          ]
        }
      ],
      "related": [
        "clear-engineering-backlog",
        "vibe-engineering-lane",
        "operate-software-engineering",
        "fix-one-bug-with-regression-test",
        "fix-failing-github-actions-job",
        "example-shopping-list-evidence"
      ],
      "sections": [
        {
          "heading": "A ticket count is not a capacity model",
          "body": [
            "Split a feature into a bounded behaviour change, a bug into a reproducible failure and regression test, and maintenance into a named compatibility or operational result. An arbitrary large ticket should not count as one small item. The proposed lane has one active item and a ceiling of four scoped monthly items, not four guaranteed completions."
          ],
          "items": [
            "List dependencies and access prerequisites before ordering work.",
            "Name excluded behaviours and the evidence needed for acceptance.",
            "Do not convert uncertain estimates into a throughput guarantee."
          ]
        },
        {
          "heading": "Preserve the meaning of checks",
          "body": [
            "A test that correctly catches an application bug should remain meaningful. A CI job repair must not remove assertions, alter the trigger or ignore the failure merely to obtain a pass. Acceptance records should retain source revision, event and runner context when those affect the test."
          ],
          "items": [
            "Require a failing-then-passing regression test for the named bug.",
            "Require a runnable preview or example for the agreed feature.",
            "Record separate review findings and how they were resolved."
          ]
        },
        {
          "heading": "Define the coordination boundary",
          "body": [
            "A fixed backlog project, recurring CI responsibility, engineering lane and full engineering function are different scopes. State who prioritises, clarifies product decisions, approves sensitive actions and performs the authorised release. A wider composition should include its child outcomes explicitly rather than quietly expanding a small repair."
          ],
          "items": [
            "Keep live deployment separate from preview acceptance.",
            "Resolve necessary human expertise before acceptance rather than surprising the buyer."
          ]
        },
        {
          "heading": "Evidence and commercial reality",
          "body": [
            "The public sample illustrates the evidence structure, not a completed customer lane. Client throughput, accepted prices and delivery economics remain unmeasured. Start with representative backlog items and budget context; final capacity, price, taxes, billing and cancellation are settled in a written proposal."
          ],
          "items": []
        }
      ],
      "incoming": [
        "example-shopping-list-evidence"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/buyers/engineering-manager-backlog/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fbuyers%2Fengineering-manager-backlog%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fbuyers%2Fengineering-manager-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."
      }
    },
    {
      "id": "buyer-finance-manager-invoice-integration",
      "type": "buyer",
      "title": "For a finance manager: make an invoice integration complete and safe to repeat",
      "description": "Define authoritative fields, duplicate rules and reconciliation before repairing a spreadsheet-to-accounting automation.",
      "slug": "finance-manager-invoice-integration",
      "url": "/buyers/finance-manager-invoice-integration/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Zapier: action troubleshooting",
          "url": "https://help.zapier.com/hc/en-us/articles/8496037690637-Test-your-Zap-actions",
          "checked": "2026-10-10",
          "claims": [
            "The retrieved official page describes inspecting step errors, response details and outbound requests, and resolving missing values, formatting or permission problems before retry."
          ]
        }
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns",
        "guide-zapier-field-mapping",
        "tool-workflow-value",
        "zapier-facebook-leads-to-salesforce"
      ],
      "sections": [
        {
          "heading": "Specify the record, not just the connection",
          "body": [
            "Write an example invoice using synthetic values: supplier/customer reference, dates, currency, line items, amounts and the agreed accounting codes. Identify which system is authoritative for each field. A connection test can succeed while the business record is incomplete or assigned to the wrong organisation."
          ],
          "items": [
            "No real supplier bank details, invoice documents or customer records in an enquiry.",
            "Name mandatory fields and validation rules.",
            "Separate account mapping from tax or accounting advice, which is not included."
          ]
        },
        {
          "heading": "Decide duplicate behaviour before retrying",
          "body": [
            "If a run fails after creating a target record, retrying can create another one. Agree a stable source reference and the intended create-versus-update behaviour. The finance owner should define how exceptions are reconciled; a provider error message does not prove that no write occurred."
          ],
          "items": [
            "Test with disposable records on an authorised route.",
            "Inspect target state before replaying a failed action.",
            "Do not bulk replay historical invoices as a diagnostic step."
          ]
        },
        {
          "heading": "What acceptance should include",
          "body": [
            "Inspect the agreed synthetic invoice in the destination with every required field, expected totals and correct organisation. Repeat the same source input and verify the agreed duplicate rule. Test a missing mandatory field and ensure it is visibly rejected or routed for review instead of silently creating incomplete accounting data."
          ],
          "items": [
            "Keep redacted source-to-target results and exception evidence.",
            "Human approval stays with the finance owner for posting or consequential live changes."
          ]
        },
        {
          "heading": "Evaluate value honestly",
          "body": [
            "Estimate time saved using your own measured case volume and effort, including checking and exceptions. Time value is not automatically cash savings: staff may use freed capacity elsewhere rather than reduce payroll. The workflow calculator uses your inputs, not a promised provider ROI or our service quote."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-zapier-field-mapping",
        "tool-workflow-value"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/buyers/finance-manager-invoice-integration/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fbuyers%2Ffinance-manager-invoice-integration%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fbuyers%2Ffinance-manager-invoice-integration%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."
      }
    },
    {
      "id": "guide-zapier-field-mapping",
      "type": "guide",
      "title": "A Zap runs, but fields are missing: trace the value from trigger to destination",
      "description": "Inspect one synthetic record through each step and separate missing input, transformation, permissions and destination validation.",
      "slug": "zapier-field-mapping",
      "url": "/guides/zapier-field-mapping/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Zapier: action troubleshooting",
          "url": "https://help.zapier.com/hc/en-us/articles/8496037690637-Test-your-Zap-actions",
          "checked": "2026-10-10",
          "claims": [
            "The retrieved official article describes inspecting failed steps, logs, response details and outbound requests.",
            "Missing values, formatting, permissions, expired credentials and limits can cause action problems."
          ]
        }
      ],
      "related": [
        "zapier-sheets-to-xero-missing-columns",
        "zapier-facebook-leads-to-salesforce",
        "buyer-finance-manager-invoice-integration",
        "tool-workflow-value"
      ],
      "sections": [
        {
          "heading": "Follow one value across the boundaries",
          "body": [
            "Choose one authorised synthetic source record with known values. Check what the trigger provided, what each transformation returned, what the action sent and what the destination stored. A workflow marked successful is not enough to prove all intended fields were mapped."
          ],
          "items": [
            "Name the destination organisation, object and field.",
            "Record whether the source value was absent, blank, transformed or rejected.",
            "Do not export real lead or invoice payloads for an enquiry."
          ]
        },
        {
          "heading": "Read the step evidence",
          "body": [
            "Zapier's retrieved troubleshooting article describes inspecting the affected step's response and outgoing request. Missing inputs may mean useful logs are absent. Distinguish an absent source field from a stale mapping, invalid format or account permission problem; those require different changes."
          ],
          "items": [
            "Compare field names and expected types, not just display labels.",
            "Resolve expired access with the account holder without sending its credential.",
            "Check the destination after a failure before assuming it contains no record."
          ]
        },
        {
          "heading": "Testing is not assumed to be a dry run",
          "body": [
            "Do not assume a button labelled Test or Replay leaves connected systems unchanged. Agree a disposable destination and review the specific action's effects before invoking it. Lead creation, invoice creation and notification can have consequences even with made-up input. The operator needs written authority for the named test route."
          ],
          "items": [
            "Use a stable synthetic reference to identify created records.",
            "Test the create-versus-update or duplicate rule.",
            "Avoid bulk replay until reconciliation and recovery are agreed."
          ]
        },
        {
          "heading": "Prove the complete business record",
          "body": [
            "Acceptance should show the required values in the intended target record, correct object/account mapping and a controlled missing-field case. Keep redacted before-and-after step evidence and any remaining exclusions. Credentials, client access and purchases are not part of first-contact diagnosis; scope is confirmed before private work."
          ],
          "items": []
        }
      ],
      "incoming": [
        "buyer-finance-manager-invoice-integration",
        "tool-workflow-value"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/zapier-field-mapping/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fzapier-field-mapping%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fzapier-field-mapping%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."
      }
    },
    {
      "id": "guide-merchant-brand-identifiers",
      "type": "guide",
      "title": "Shopify product rejected for brand identifiers: use the actual product facts",
      "description": "Differentiate a missing brand from identifier requirements and avoid inventing values simply to clear a Merchant Center warning.",
      "slug": "merchant-brand-identifiers",
      "url": "/guides/merchant-brand-identifiers/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Google Merchant Center: brand attribute",
          "url": "https://support.google.com/merchants/answer/6324351?hl=en",
          "checked": "2026-10-10",
          "claims": [
            "Use an accurate identifiable brand or manufacturer.",
            "Do not guess a brand when it is unknown.",
            "Custom or private-label goods have specific guidance; custom goods are not automatically exempt from identifiers."
          ]
        }
      ],
      "related": [
        "shopify-merchant-brand-identifier",
        "platform-shopify",
        "buyer-ecommerce-owner-checkout"
      ],
      "sections": [
        {
          "heading": "Read the exact rejection",
          "body": [
            "Record the affected channel, item and attribute named in the diagnostic. A missing brand, missing GTIN and invalid manufacturer part number are different issues. Check the actual product and supplier information rather than copying one generic value across the catalogue."
          ],
          "items": [
            "Keep a redacted rejection message and the named affected product.",
            "Compare product facts with the submitted feed value.",
            "Do not invent a GTIN, manufacturer or brand to silence the warning."
          ]
        },
        {
          "heading": "Apply the relevant product rule",
          "body": [
            "Google's brand guidance requires an accurate brand or maker where identifiable. Custom and private-label goods have specific rules, including shop-name branding in certain cases; custom goods are not automatically exempt. Goods with no identifiable brand can have different treatment. Follow the current attribute guidance for the actual item rather than marking every product identifier_exists false."
          ],
          "items": [
            "Use the recognised maker for a third-party compatible product.",
            "Review other required identifiers separately.",
            "Do not alter product images to fabricate branding evidence."
          ]
        },
        {
          "heading": "Check the mapping before resubmission",
          "body": [
            "Identify where the channel gets its brand and identifier values: the source product fields, a feed mapping or an app transformation. Correct the authoritative source or agreed mapping and inspect the submitted result. A correct Shopify display field does not guarantee the feed sent the same value."
          ],
          "items": [
            "Limit changes to the agreed product set.",
            "Preserve a before/after field record with public or synthetic facts.",
            "Account-holder authority is required for channel changes and submission."
          ]
        },
        {
          "heading": "Acceptance boundary",
          "body": [
            "The bounded outcome should name which products and rejection reasons were corrected and the channel result used to verify them. It does not promise rankings, advertising approval for unrelated policy issues or increased sales. Send the redacted diagnostic and product facts initially, not merchant credentials."
          ],
          "items": []
        }
      ],
      "incoming": [
        "buyer-ecommerce-owner-checkout"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/merchant-brand-identifiers/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fmerchant-brand-identifiers%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fmerchant-brand-identifiers%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."
      }
    },
    {
      "id": "guide-certificate-expiry-renewal",
      "type": "guide",
      "title": "Certificate expired? Diagnose the served certificate and renewal path separately",
      "description": "Identify the affected hostname and authorised certificate manager without assuming a missing reminder email means renewal stopped.",
      "slug": "certificate-expiry-renewal",
      "url": "/guides/certificate-expiry-renewal/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Let's Encrypt: ending expiration emails",
          "url": "https://letsencrypt.org/2025/01/22/ending-expiration-emails/",
          "checked": "2026-10-10",
          "claims": [
            "Expiration notification emails ended on 4 June 2025.",
            "The retirement concerns reminders, not ending automated renewal."
          ]
        }
      ],
      "related": [
        "ssl-certificate-expired-not-secure",
        "guide-dns-migration-email",
        "hosting-custom-php-site-off-cpanel"
      ],
      "sections": [
        {
          "heading": "Record the precise warning",
          "body": [
            "Identify the hostname and browser message: expired, wrong name and an untrusted chain are different findings. Check the certificate actually served to that hostname; a certificate installed elsewhere may not be the one a visitor receives. Do not instruct visitors to bypass the warning as a repair."
          ],
          "items": [
            "Keep the public hostname and expiry date if visible.",
            "Identify whether the certificate is managed by a host, CDN or server operator.",
            "Keep private keys and account credentials out of an enquiry."
          ]
        },
        {
          "heading": "A missing email is not the renewal diagnosis",
          "body": [
            "Let's Encrypt ended expiration reminder emails on 4 June 2025. The announcement did not end automated renewals. If renewal failed, the authorised manager should inspect its existing renewal and validation logs; waiting for a reminder is no longer a reliable operational control."
          ],
          "items": [
            "Ask who owns the renewal configuration and alerting.",
            "Inspect redacted validation errors and preceding DNS or hosting changes.",
            "Do not install a second competing renewal process without understanding the first."
          ]
        },
        {
          "heading": "Scope the safe repair",
          "body": [
            "Confirm the named certificate, validation route and server or provider setting that needs repair. Changes to DNS, firewall, web-server configuration or provider accounts require approved access and a reversal plan. A renewal command that succeeds is only part of acceptance if the site still serves the old certificate."
          ],
          "items": [
            "Verify the served hostname and chain after the approved change.",
            "Check the agreed renewal mechanism and future failure-alert route.",
            "Avoid buying a certificate or changing accounts as an unauthorised shortcut."
          ]
        },
        {
          "heading": "What success means",
          "body": [
            "The agreed hostname serves a valid certificate without the named warning, and the authorised operator has evidence of the repaired renewal path. That does not prove every security property of the website. Request the repair with hostname and redacted warning; no private key is needed initially."
          ],
          "items": []
        }
      ],
      "incoming": [],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/certificate-expiry-renewal/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fcertificate-expiry-renewal%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fcertificate-expiry-renewal%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."
      }
    },
    {
      "id": "guide-hosting-disk-full",
      "type": "guide",
      "title": "Hosting disk full: restore service without deleting the data you need",
      "description": "Preserve evidence and separate safe capacity recovery from destructive deletion, application repair and backup verification.",
      "slug": "hosting-disk-full",
      "url": "/guides/hosting-disk-full/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "PostgreSQL: backup boundaries",
          "url": "https://www.postgresql.org/docs/current/backup-dump.html",
          "checked": "2026-10-10",
          "claims": [
            "A normal database dump covers one database, not cluster-wide roles or every website file."
          ]
        },
        {
          "label": "Django: backups and logging",
          "url": "https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/",
          "checked": "2026-10-10",
          "claims": [
            "Database and uploaded media need backup strategies and logging should be reviewed."
          ]
        }
      ],
      "related": [
        "hosting-disk-full-website-down",
        "hosting-offsite-backups-with-restore-test",
        "guide-backup-restore-evidence"
      ],
      "sections": [
        {
          "heading": "Do not start with recursive deletion",
          "body": [
            "Record the host's actual capacity error and who administers the service. A full volume, quota or exhausted file count can require different recovery. The following is a conservative triage checklist, not provider-specific command instructions. Never delete uploads, database files or unfamiliar directories merely because they are large."
          ],
          "items": [
            "Keep the first redacted application or host error.",
            "Ask the authorised operator to inspect capacity through the host's supported controls.",
            "Do not send a server login or private directory dump in the enquiry."
          ]
        },
        {
          "heading": "Know what a recovery action can destroy",
          "body": [
            "Temporary files, logs, uploads and database data have different retention and recovery needs. A scheduled backup message does not prove the latest data can be restored. Confirm the affected data boundary and trusted restore evidence before any destructive action. If no safe candidate is known, a capacity change may need separate account-holder approval rather than guessing what to delete."
          ],
          "items": [
            "No storage purchase or quota increase is implied by this guide.",
            "Do not erase the only diagnostic evidence.",
            "Do not remove database-managed files outside the database's documented procedure."
          ]
        },
        {
          "heading": "Restored capacity is not full acceptance",
          "body": [
            "After an authorised recovery, check the agreed read and write flow, uploads and relevant background work. A page rendering can hide failed writes, missing files or a stopped queue. Identify why capacity grew so the same incident does not immediately return; retention and monitoring changes should be separately scoped and approved."
          ],
          "items": [
            "Record remaining headroom and the verification time.",
            "Check that cleanup did not remove required application content.",
            "Keep restoration exceptions visible."
          ]
        },
        {
          "heading": "Request a bounded recovery",
          "body": [
            "Send provider type, redacted capacity error, affected flow and whether a verified restore point exists. The quote depends on the safe recovery route and data risk, not an invented minutes-to-fix promise. Production actions require the authorised operator and explicit agreement."
          ],
          "items": []
        }
      ],
      "incoming": [],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/hosting-disk-full/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fhosting-disk-full%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fhosting-disk-full%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."
      }
    },
    {
      "id": "guide-shopify-theme-update-regression",
      "type": "guide",
      "title": "Restore a custom product tab after a Shopify theme update",
      "description": "Compare the updated draft with the previous theme and distinguish editor settings from incompatible custom code.",
      "slug": "shopify-theme-update-regression",
      "url": "/guides/shopify-theme-update-regression/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Shopify: updating themes",
          "url": "https://help.shopify.com/en/manual/online-store/themes/managing-themes/updating-themes",
          "checked": "2026-10-10",
          "claims": [
            "Updates create a draft; editor customisations carry over.",
            "Custom code transfers only when compatible; review custom CSS and app compatibility before publishing."
          ]
        }
      ],
      "related": [
        "platform-shopify",
        "shopify-product-tab-after-theme-update",
        "guide-shopify-app-uninstall-cleanup"
      ],
      "sections": [
        {
          "heading": "Name the exact missing feature",
          "body": [
            "Identify one product, its assigned template and the tab's expected content. Was it configured in the theme editor, inserted by an app or added through a code change? Keep the previous theme as the reference and record the update version. A missing tab can be a template assignment or settings problem, not necessarily missing code."
          ],
          "items": [
            "Capture old and new behaviour using public content only.",
            "Check whether the tab is absent everywhere or on one template.",
            "Do not publish repeated experimental themes on the live storefront."
          ]
        },
        {
          "heading": "Read the update's carryover status",
          "body": [
            "Shopify theme updates create a separate draft. Editor customisations can carry over, but custom and app-generated code transfer only if compatible. Review any notice that code edits were or were not included. Compare the specific template, section or snippet with the old theme rather than copying the entire old codebase over the update."
          ],
          "items": [
            "Inspect app blocks and theme settings on the draft.",
            "Recheck CSS against the updated theme's selectors.",
            "Preserve necessary new-theme fixes instead of blindly reverting all files."
          ]
        },
        {
          "heading": "Define a useful acceptance test",
          "body": [
            "On the draft, the named product shows the expected tab and content, the tab opens with keyboard and pointer input, and the agreed mobile layout remains usable. Also check an unaffected product template and its add-to-cart path. This proves the bounded storefront change, not sales uplift or every checkout path."
          ],
          "items": [
            "Record changed files or settings and screenshots of the agreed states.",
            "Name any app dependency or content that was not included.",
            "Keep a clear route back to the prior published theme."
          ]
        },
        {
          "heading": "Before requesting work",
          "body": [
            "Send the theme names and versions, product/template affected and a redacted description of the lost feature. The account holder controls publication and grants only agreed access after scope. A missing tab does not require passwords or private customer exports in an enquiry."
          ],
          "items": []
        }
      ],
      "platforms": [
        "shopify"
      ],
      "incoming": [
        "guide-shopify-app-uninstall-cleanup",
        "platform-shopify"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/shopify-theme-update-regression/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fshopify-theme-update-regression%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fshopify-theme-update-regression%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."
      }
    },
    {
      "id": "guide-shopify-app-uninstall-cleanup",
      "type": "guide",
      "title": "Uninstalled a Shopify review app? Check code, data and billing separately",
      "description": "Remove a leftover storefront widget without assuming app removal preserved reviews or ended an external subscription.",
      "slug": "shopify-app-uninstall-cleanup",
      "url": "/guides/shopify-app-uninstall-cleanup/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Shopify: uninstalling apps",
          "url": "https://help.shopify.com/en/manual/apps/uninstalling-apps",
          "checked": "2026-10-10",
          "claims": [
            "Apps can leave theme code after uninstall.",
            "Separately billed subscriptions are not necessarily cancelled by Shopify uninstall.",
            "App developers can provide cleanup and billing guidance."
          ]
        }
      ],
      "related": [
        "platform-shopify",
        "shopify-uninstalled-review-app-residue",
        "guide-shopify-theme-update-regression"
      ],
      "sections": [
        {
          "heading": "Three checks, not one uninstall button",
          "body": [
            "Removing an app from Shopify, removing its storefront code and preserving its review data are different tasks. Shopify warns that app code may remain after uninstall. Separately billed subscriptions may also require cancellation with the provider. Do not interpret an absent app listing as proof that every widget, stored review or external charge has been handled."
          ],
          "items": [
            "Identify the app and its own cleanup instructions.",
            "Record which review data or authorised export must be retained.",
            "Ask the account holder to check external billing directly."
          ]
        },
        {
          "heading": "Compare a theme copy",
          "body": [
            "Work on an unpublished theme copy and locate the app's specific snippets, includes, blocks or assets. A name that resembles the app is a clue, not permission to delete everything matching it. Templates can share code with other features. Keep the baseline theme and changed-file list so the edit can be reversed."
          ],
          "items": [
            "Check the product pages where the residue appears.",
            "Compare console or network errors without exposing private account information.",
            "Do not upload private review exports to an agent workspace."
          ]
        },
        {
          "heading": "Acceptance is more than hiding the widget",
          "body": [
            "The residual widget or unwanted reference should disappear on the agreed pages, preserved review content should remain available through the agreed route, and unrelated product-page behaviour should still work. If data recovery requires vendor access, an absent export or another subscription, stop and re-scope rather than claim the reviews are saved."
          ],
          "items": [
            "Test one affected and one unaffected product template.",
            "Record what was removed and what was retained.",
            "Keep vendor billing and live-theme publication outside an unauthorised test."
          ]
        },
        {
          "heading": "Safe enquiry",
          "body": [
            "Send the app name, public affected page, uninstall date and whether the needed export already exists. Do not send review records, credentials or an access invitation initially. We can scope the cleanup from the symptoms and agree the private route later."
          ],
          "items": []
        }
      ],
      "platforms": [
        "shopify"
      ],
      "incoming": [
        "guide-shopify-theme-update-regression",
        "platform-shopify"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/shopify-app-uninstall-cleanup/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fshopify-app-uninstall-cleanup%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fshopify-app-uninstall-cleanup%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."
      }
    },
    {
      "id": "platform-php",
      "type": "platform",
      "title": "Legacy PHP websites: separate runtime changes from database and hosting moves",
      "description": "Choose between PHP compatibility repair, removed database API migration and a hosting move with different evidence and rollback needs.",
      "slug": "php",
      "url": "/platforms/php/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "PHP: PHP 8.0 incompatibilities",
          "url": "https://www.php.net/manual/en/migration80.incompatible.php",
          "checked": "2026-10-10",
          "claims": [
            "PHP 8.0 changes loose comparisons and promotes some warnings to exceptions.",
            "PDO defaults to exception error mode in PHP 8.0."
          ]
        },
        {
          "label": "PHP: removed mysql extension",
          "url": "https://www.php.net/manual/en/mysql.installation.php",
          "checked": "2026-10-10",
          "claims": [
            "The mysql extension was removed in PHP 7.0; MySQLi or PDO_MySQL are replacements."
          ]
        }
      ],
      "related": [
        "guide-php8-compatibility-checklist",
        "guide-php-mysql-extension-repair",
        "php-7-site-to-php-8",
        "php-mysql-connect-error-database-repair",
        "hosting-custom-php-site-off-cpanel",
        "php-contact-form-emails-not-arriving"
      ],
      "sections": [
        {
          "heading": "The host changing PHP does not define the whole job",
          "body": [
            "A host's runtime switch can expose a language incompatibility, missing extension or old database API. Moving the same application to another host adds filesystem, web-server, email and data-cutover questions. Quote those separately unless the agreed outcome genuinely includes all of them."
          ],
          "items": [
            "Record old and target PHP versions and required extensions.",
            "Identify critical flows such as login, form submission, checkout and reporting.",
            "Keep the first redacted error after the host change."
          ]
        },
        {
          "heading": "Some old calls cannot be restored by configuration",
          "body": [
            "The original mysql extension was removed in PHP 7.0. An undefined mysql_connect error therefore points to code that needs a supported API, not just a database password reset. PHP 8.0 adds further language and error-handling changes, so a successful home page cannot prove an old site's business behaviour survives."
          ],
          "items": [
            "MySQLi and PDO_MySQL require deliberate API changes.",
            "Review queries, result handling, transactions and connection errors.",
            "Keep user-provided values parameterised; compatibility work should not introduce injection risk."
          ]
        },
        {
          "heading": "Test the same business result",
          "body": [
            "Use an authorised copy with synthetic data to compare key reads and writes before and after the change. Inventory uploaded files, scheduled work and email as well as the database. A hosting rollback must account for writes after cutover; returning DNS or code to the old host does not reconcile two changing databases."
          ],
          "items": [
            "Restore a backup in isolation before relying on it.",
            "Name the live switch owner and the data-write boundary."
          ]
        },
        {
          "heading": "What to send first",
          "body": [
            "Send versions, host type, affected flow and a redacted first error. Do not send a cPanel login, database dump, password or confidential code. Compatibility repair and hosting migration remain enquiry-led scopes, not guarantees that every undocumented legacy feature can be preserved at a posted price."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-php-mysql-extension-repair",
        "guide-php8-compatibility-checklist"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/platforms/php/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fphp%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fplatforms%2Fphp%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."
      }
    },
    {
      "id": "guide-php-mysql-extension-repair",
      "type": "guide",
      "title": "Undefined function mysql_connect: why a simple rename is not a database repair",
      "description": "Recognise a removed PHP extension and plan a tested migration of connection, query and result handling.",
      "slug": "php-mysql-extension-repair",
      "url": "/guides/php-mysql-extension-repair/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "PHP: mysql installation",
          "url": "https://www.php.net/manual/en/mysql.installation.php",
          "checked": "2026-10-10",
          "claims": [
            "mysql was deprecated in PHP 5.5 and removed in PHP 7.0.",
            "MySQLi or PDO_MySQL should replace it."
          ]
        },
        {
          "label": "PHP: PHP 8.0 incompatibilities",
          "url": "https://www.php.net/manual/en/migration80.incompatible.php",
          "checked": "2026-10-10",
          "claims": [
            "PDO default error handling becomes exceptions in PHP 8.0."
          ]
        }
      ],
      "related": [
        "platform-php",
        "php-mysql-connect-error-database-repair",
        "guide-php8-compatibility-checklist"
      ],
      "sections": [
        {
          "heading": "Distinguish an absent API from a refused connection",
          "body": [
            "An undefined mysql_connect function on PHP 7 or later is consistent with use of the removed mysql extension. That differs from a supported database client reporting access denied or connection refused. Record the PHP runtime and exact redacted error before changing credentials or database permissions."
          ],
          "items": [
            "Check whether the code uses other mysql_* calls.",
            "Confirm which supported extension exists on the target host.",
            "Do not solve this by returning a public site to an unsupported runtime without an agreed security decision."
          ]
        },
        {
          "heading": "Migrate a database boundary, not one function",
          "body": [
            "MySQLi and PDO_MySQL are supported replacements, but their connection, query, result and error interfaces differ. A blanket name substitution does not account for argument order, explicit connection objects or prepared statements. Review the application's shared database wrapper first; centralising the change can be safer than inconsistent edits across pages."
          ],
          "items": [
            "Inventory reads, inserts, updates and transactions.",
            "Define handling for a failed connection and a failed query.",
            "Keep user input bound as parameters rather than concatenating it into SQL."
          ]
        },
        {
          "heading": "Use synthetic records to prove behaviour",
          "body": [
            "Test a representative read, insert, update and failure path on an isolated database with disposable records. Check affected row counts, character encoding and the expected application messages. PHP 8's PDO exception default can expose a previously silent failure, so test the error path as well as successful queries."
          ],
          "items": [
            "Verify no extra records are written by repeated requests.",
            "Review the complete changed-file list and database API calls.",
            "Keep production dumps and credentials out of the enquiry and test workspace."
          ]
        },
        {
          "heading": "Scope boundary",
          "body": [
            "This repair is an API migration for the agreed application boundary. A schema redesign, hosting move, lost-data recovery or every unrelated PHP incompatibility is different work. Request a quote with runtime versions and the redacted error; safe private code access follows an agreed scope."
          ],
          "items": []
        }
      ],
      "platforms": [
        "php"
      ],
      "incoming": [
        "platform-php"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/php-mysql-extension-repair/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fphp-mysql-extension-repair%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fphp-mysql-extension-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."
      }
    },
    {
      "id": "guide-php8-compatibility-checklist",
      "type": "guide",
      "title": "PHP 7 to PHP 8: test changed behaviour, not just syntax",
      "description": "Use the official incompatibility notes to target comparisons, exceptions and critical business flows on an isolated copy.",
      "slug": "php8-compatibility-checklist",
      "url": "/guides/php8-compatibility-checklist/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "PHP: PHP 8.0 incompatibilities",
          "url": "https://www.php.net/manual/en/migration80.incompatible.php",
          "checked": "2026-10-10",
          "claims": [
            "Non-numeric string comparisons changed.",
            "Some invalid operations now throw TypeError or Error.",
            "PDO defaults to exceptions; @ no longer silences fatal errors."
          ]
        }
      ],
      "related": [
        "platform-php",
        "php-7-site-to-php-8",
        "php-mysql-connect-error-database-repair",
        "wordpress-critical-error-after-update",
        "tool-migration-readiness"
      ],
      "sections": [
        {
          "heading": "Choose an exact target",
          "body": [
            "PHP 8 is a family of releases, not a single compatibility target. Record the current version, intended version, extensions and dependency constraints. Read the incompatibility notes for every release crossed; this guide highlights PHP 8.0 changes and is not a claim that later versions have no additional changes."
          ],
          "items": [
            "Build a safe baseline with the agreed critical flows.",
            "Inventory libraries, scheduled commands, uploads and database access.",
            "Use synthetic data rather than a production dump."
          ]
        },
        {
          "heading": "Target behaviour that can silently change",
          "body": [
            "PHP 8.0 changes loose comparison between numbers and non-numeric strings: for example, 0 == 'foo' changes from true to false. Legacy validation and branching logic can therefore behave differently without a syntax error. Test representative valid, empty and invalid inputs using expected business results."
          ],
          "items": [
            "Check price, identifier and form-validation comparisons.",
            "Review reliance on undefined variables, array keys or constants.",
            "Verify both successful and rejected requests."
          ]
        },
        {
          "heading": "Check error paths",
          "body": [
            "Some warnings become TypeError or Error, inherited method-signature incompatibilities become fatal, and PDO's default error mode becomes exceptions. The @ operator no longer silences fatal errors. A site that appears fine with one valid input can still fail under an ordinary missing value or failed database operation."
          ],
          "items": [
            "Keep detailed errors out of the public response.",
            "Test failed database connections and validation failures safely.",
            "Do not suppress all errors to claim compatibility."
          ]
        },
        {
          "heading": "Acceptance and reversal",
          "body": [
            "Acceptance should name the agreed visitor and administrative flows on the exact target runtime, with baseline comparisons and independent review. A runtime rollback may not reverse schema, stored-data or external-service changes. Set those boundaries before live publication. A successful lint or home-page load alone is not an application upgrade."
          ],
          "items": []
        }
      ],
      "platforms": [
        "php"
      ],
      "incoming": [
        "platform-php",
        "guide-php-mysql-extension-repair"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/php8-compatibility-checklist/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fphp8-compatibility-checklist%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fphp8-compatibility-checklist%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."
      }
    },
    {
      "id": "platform-laravel",
      "type": "platform",
      "title": "Laravel upgrades and background jobs: treat deployment as more than web code",
      "description": "Understand long-lived workers, failed jobs and version-specific compatibility before upgrading or restarting a business workflow.",
      "slug": "laravel",
      "url": "/platforms/laravel/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Laravel 12 queue documentation",
          "url": "https://laravel.com/docs/12.x/queues",
          "checked": "2026-10-10",
          "claims": [
            "Queue workers are long-lived and do not automatically notice code changes.",
            "Worker timeout must be shorter than retry_after."
          ]
        },
        {
          "label": "Laravel official queue source",
          "url": "https://raw.githubusercontent.com/laravel/docs/12.x/queues.md",
          "checked": "2026-10-10",
          "claims": [
            "queue:restart exits workers gracefully after the current job; a process manager must restart them.",
            "queue:failed lists recorded failed jobs."
          ]
        }
      ],
      "related": [
        "guide-laravel-queue-email-stopped",
        "laravel-queue-emails-stopped-sending",
        "laravel-old-app-to-supported-version",
        "tool-migration-readiness"
      ],
      "sections": [
        {
          "heading": "Inventory the application beyond HTTP",
          "body": [
            "A Laravel app can serve pages while queued email or another background operation is stopped. An upgrade needs the web flow, queue connection, worker process, scheduled commands and dependency inventory. Define the exact current and target versions; this page uses Laravel 12 queue documentation, not an assertion that commands and defaults are identical in every legacy app."
          ],
          "items": [
            "Identify the queue connection and named queues.",
            "Record whether the failure began after deployment.",
            "Separate the business operation from its email notification."
          ]
        },
        {
          "heading": "Workers carry state across jobs",
          "body": [
            "Laravel queue workers keep the booted application in memory. They do not automatically reload code after deployment. Laravel documents a graceful restart signal, but the workers then exit; a correctly configured process manager is needed to launch replacements. The signal also depends on the application's cache configuration."
          ],
          "items": [
            "Inspect worker supervision and existing logs before restarting.",
            "Avoid starting a second unmanaged worker as a temporary fix.",
            "Make the deployment plan include compatible handling of already queued jobs."
          ]
        },
        {
          "heading": "Retries can repeat a real-world action",
          "body": [
            "A failed job may already have sent a message or changed an external system before its failure was recorded. Retrying is not automatically harmless. Timeout and reservation settings also matter: a worker timeout should be shorter than retry_after so a still-running job is not made available prematurely. Review operation identity and duplicate protection before replay."
          ],
          "items": [
            "Keep job IDs and a redacted exception, not whole private payloads.",
            "Use a synthetic workflow and safe email sink for testing."
          ]
        },
        {
          "heading": "Request the right scope",
          "body": [
            "One stopped queue or email workflow is different from a framework upgrade. Send the versions, queue type, preceding deployment and redacted symptom. Do not send .env files, passwords or queue payloads containing personal data. Scope and authorised execution are agreed before private work or a live restart."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-laravel-queue-email-stopped"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/platforms/laravel/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Flaravel%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fplatforms%2Flaravel%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."
      }
    },
    {
      "id": "guide-laravel-queue-email-stopped",
      "type": "guide",
      "title": "Laravel emails stopped sending: distinguish queue, worker and mail delivery failures",
      "description": "Inspect the job boundary before restarting workers or retrying messages that may already have been sent.",
      "slug": "laravel-queue-email-stopped",
      "url": "/guides/laravel-queue-email-stopped/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Laravel official queue documentation source",
          "url": "https://raw.githubusercontent.com/laravel/docs/12.x/queues.md",
          "checked": "2026-10-10",
          "claims": [
            "queue:failed lists failed jobs with IDs, connections and failure times.",
            "Workers do not notice changed code until restarted.",
            "queue:restart gracefully exits workers; process supervision and cache configuration matter."
          ]
        }
      ],
      "related": [
        "platform-laravel",
        "laravel-queue-emails-stopped-sending",
        "php-contact-form-emails-not-arriving",
        "guide-contact-form-delivery-boundaries"
      ],
      "sections": [
        {
          "heading": "Locate where the message stopped",
          "body": [
            "Separate the request that dispatches a job, storage on the intended queue, worker execution and mail-provider acceptance. A web success response is not proof that the job ran. Nor is a completed job proof that a recipient received the message. Record one synthetic test case and follow its identifiers through those boundaries."
          ],
          "items": [
            "Check the named queue connection and queue, not just a global pending count.",
            "Inspect existing worker and application errors.",
            "Check whether the issue followed a code or environment change."
          ]
        },
        {
          "heading": "Inspect before replay",
          "body": [
            "Laravel's queue:failed command lists recorded failures, including job IDs and failure times. An authorised maintainer should inspect the exception and whether any prior attempt performed an external action. Do not paste the payload into an enquiry: it can contain customer addresses, order information or private application state."
          ],
          "items": [
            "Use a redacted failure category and job identifier for scoping.",
            "Do not run queue:retry all to diagnose one stopped notification.",
            "Resolve an expired provider credential with its account holder; never request its value by email."
          ]
        },
        {
          "heading": "A graceful restart needs replacement workers",
          "body": [
            "Long-lived workers do not reload deployed code. queue:restart requests exit after the current job, so process supervision must be healthy and capable of starting replacements. Verify the cache used for restart signals. Before any live restart, agree the execution window, current job handling and who can reverse the deployment."
          ],
          "items": [
            "Do not create a competing unmanaged worker.",
            "Check timeout versus reservation settings if jobs overlap.",
            "Test with a safe message sink rather than a real customer recipient."
          ]
        },
        {
          "heading": "Acceptance evidence",
          "body": [
            "The agreed synthetic job should enter the intended queue, execute once, produce its expected message in the test sink and retain a traceable completion result. A negative test should show a controlled failure instead of silent loss. Restoring production delivery is a separate authorised switch; no mass resend is implied by a passing test."
          ],
          "items": []
        }
      ],
      "platforms": [
        "laravel"
      ],
      "incoming": [
        "platform-laravel"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/laravel-queue-email-stopped/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Flaravel-queue-email-stopped%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Flaravel-queue-email-stopped%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."
      }
    },
    {
      "id": "platform-django",
      "type": "platform",
      "title": "Django modernisation: upgrade the dependency chain and preserve business behaviour",
      "description": "Plan an incremental framework and Python transition with tested dependencies, safe settings and explicit database boundaries.",
      "slug": "django",
      "url": "/platforms/django/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Django: upgrading versions",
          "url": "https://docs.djangoproject.com/en/5.2/howto/upgrade-version/",
          "checked": "2026-10-10",
          "claims": [
            "Incremental feature-release upgrades are usually easier.",
            "Review release notes, third-party compatibility and deprecation warnings."
          ]
        },
        {
          "label": "Django: deployment checklist",
          "url": "https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/",
          "checked": "2026-10-10",
          "claims": [
            "DEBUG must not be enabled in production.",
            "Production settings, database and media backup strategies need review."
          ]
        }
      ],
      "related": [
        "guide-django-incremental-upgrade",
        "django-python27-to-supported",
        "django-import-causes-502",
        "hosting-offsite-backups-with-restore-test"
      ],
      "sections": [
        {
          "heading": "A framework version is one part of the system",
          "body": [
            "Legacy Django work includes the Python interpreter, dependencies, custom middleware, authentication, database drivers and deployment settings. A package installer accepting a new version is not a successful application upgrade. Define the current dependency chain and the supported target before estimating the transition."
          ],
          "items": [
            "Name login, admin, forms and the main business write path.",
            "Record the database and media storage boundaries.",
            "Keep sensitive settings and production keys outside source and enquiries."
          ]
        },
        {
          "heading": "Upgrade through understandable steps",
          "body": [
            "Django recommends reviewing each crossed release and usually upgrading incrementally through feature releases using the latest patch for each step. Resolve project deprecation warnings before moving on and check third-party support. Unmaintained dependencies can require replacement work rather than a simple framework bump."
          ],
          "items": [
            "Keep a passing baseline and test with warnings visible.",
            "Pin the intended step rather than accidentally installing the newest available release.",
            "Recheck migrations and custom SQL separately from page rendering."
          ]
        },
        {
          "heading": "A long import is a separate reliability outcome",
          "body": [
            "An import that coincides with 502 errors needs its own reproduction and evidence: the input size, request duration, proxy or application logs and effect on other requests. Modernising the framework does not automatically solve that workflow. Any move to background execution also needs progress, error and repeat-processing rules."
          ],
          "items": [
            "Use a synthetic import fixture, not client records.",
            "Check that unrelated pages remain usable during the agreed test."
          ]
        },
        {
          "heading": "Deploy with the right settings",
          "body": [
            "Django's check --deploy examines some production settings, but it is not a whole application acceptance test. DEBUG must remain false in production, secret handling needs a private route, and database and uploaded-media backups both matter. Ask for an upgrade or import repair with versions and redacted symptoms; no private code or dump is required initially."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-backup-restore-evidence",
        "guide-django-incremental-upgrade"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/platforms/django/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fdjango%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fplatforms%2Fdjango%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."
      }
    },
    {
      "id": "guide-django-incremental-upgrade",
      "type": "guide",
      "title": "Plan a Django upgrade in testable steps",
      "description": "Use release notes, deprecation warnings and dependency compatibility to avoid an unreviewable jump from a legacy application.",
      "slug": "django-incremental-upgrade",
      "url": "/guides/django-incremental-upgrade/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Django: upgrade guide",
          "url": "https://docs.djangoproject.com/en/5.2/howto/upgrade-version/",
          "checked": "2026-10-10",
          "claims": [
            "Review every crossed final release's incompatibilities.",
            "Incremental feature-release upgrades and visible deprecation warnings are recommended.",
            "Third-party packages must support the target version; pickled cached objects may be incompatible."
          ]
        }
      ],
      "related": [
        "platform-django",
        "django-python27-to-supported",
        "tool-migration-readiness",
        "example-migration-acceptance-packet"
      ],
      "sections": [
        {
          "heading": "Create a baseline before choosing the jump",
          "body": [
            "Record Django, Python, database driver and third-party package versions. List the critical flows and existing tests. For a very old interpreter, finding a reproducible safe baseline can itself be scoped work. Do not run the legacy application with real secrets or customer data just to see whether it boots."
          ],
          "items": [
            "Keep the current dependency constraints and lock or requirements files.",
            "Identify abandoned packages and custom middleware.",
            "Name the intended maintained target and verify current support separately."
          ]
        },
        {
          "heading": "Use release boundaries as checkpoints",
          "body": [
            "Read the release notes and deprecation timeline for every release crossed. Django says incremental feature-release upgrades are usually easier, using the latest patch at each step. Each checkpoint should run the same business tests; a framework import alone does not establish that login, forms or writes still work."
          ],
          "items": [
            "Enable deprecation warnings in a disposable test environment.",
            "Resolve project warnings and assess third-party warnings separately.",
            "Select the intended version explicitly instead of using an unconstrained upgrade command."
          ]
        },
        {
          "heading": "Treat database and cache changes deliberately",
          "body": [
            "Review schema migrations, application writes and the required restore route. A code revert may not reverse schema or data changes. Django also notes that cached pickled objects can be incompatible across versions; define an authorised cache handling step rather than assuming old values remain usable."
          ],
          "items": [
            "Test with synthetic fixtures and expected row-level results.",
            "Record migration order, restrictions and rollback limitations.",
            "Keep uploaded media in the backup inventory, not only database tables."
          ]
        },
        {
          "heading": "What an upgrade handover should prove",
          "body": [
            "The target stack should run the agreed login, administrative and business flows with a reviewed dependency change and explicit deployment limits. Keep the intermediate results, final tests and restore evidence together. Production publication, secret configuration and any irreversible migration require named customer approval; this planning guide is not permission to deploy."
          ],
          "items": []
        }
      ],
      "platforms": [
        "django"
      ],
      "incoming": [
        "example-migration-acceptance-packet",
        "platform-django",
        "tool-migration-readiness"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/django-incremental-upgrade/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fdjango-incremental-upgrade%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fdjango-incremental-upgrade%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."
      }
    },
    {
      "id": "guide-nextjs-vercel-production-build",
      "type": "guide",
      "title": "Next.js works locally but fails on Vercel: compare production builds first",
      "description": "Separate development-server success, build errors and pre-build provider failures using the same revision and configuration.",
      "slug": "nextjs-vercel-production-build",
      "url": "/guides/nextjs-vercel-production-build/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Next.js: CLI",
          "url": "https://nextjs.org/docs/app/api-reference/cli/next",
          "checked": "2026-10-10",
          "claims": [
            "next dev is development mode; next build creates a production build.",
            "next start requires a prior production build."
          ]
        },
        {
          "label": "Vercel: troubleshooting builds",
          "url": "https://vercel.com/docs/deployments/troubleshoot-a-build",
          "checked": "2026-10-10",
          "claims": [
            "Read the earlier useful error, not only the last build exit code.",
            "Some precondition and integration-provisioning failures occur before build logs exist.",
            "Build context includes root directory, Node version and package manager."
          ]
        }
      ],
      "related": [
        "nextjs-vercel-build-fails",
        "guide-github-actions-local-pass-ci-fail",
        "ship-one-feature-with-running-preview",
        "stripe-nextjs-supabase-subscriptions"
      ],
      "sections": [
        {
          "heading": "Local development is not the same test",
          "body": [
            "A working next dev server does not establish that next build succeeds. On a safe authorised copy, compare the exact deployed revision, dependency lockfile, Node and package-manager versions, root directory and production build command. Use the application's declared scripts rather than assuming every Next.js version has identical commands or lint behaviour."
          ],
          "items": [
            "Read the first useful error above the final exited-with-1 line.",
            "Record whether the build reaches compilation, type checking or prerendering.",
            "Do not disable checks merely to produce a deployable artifact."
          ]
        },
        {
          "heading": "No build log can mean no build started",
          "body": [
            "Vercel documents failures before the build starts, including invalid configuration, contributor permissions and integration provisioning. If the Building logs are absent, inspect the provider's deployment error and provisioning stage. A suspended integration account is not an application code defect."
          ],
          "items": [
            "Keep the redacted deployment ID and displayed error.",
            "Route account or billing issues to the account holder.",
            "Do not skip a provisioning dependency unless the build genuinely does not need it."
          ]
        },
        {
          "heading": "Compare configuration without leaking it",
          "body": [
            "The local machine may have environment settings that are missing in a preview or production environment. Compare required variable names and presence, not secret values. Build-time requests may depend on private services; agree synthetic substitutes or safe access before reproducing them. Do not paste .env files into a support enquiry."
          ],
          "items": [
            "Check the intended project root in a monorepo.",
            "Keep the same dependency installation and build sequence.",
            "Use debug-only build options on a safe copy, not a production release."
          ]
        },
        {
          "heading": "Acceptance boundary",
          "body": [
            "A bounded repair proves the agreed production build on the intended preview route with original checks intact. It does not prove all runtime paths, a live production deployment or a Stripe subscription lifecycle. Include the baseline error, changed files, passing build evidence and separate deployment approval in the handover."
          ],
          "items": []
        }
      ],
      "incoming": [],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/nextjs-vercel-production-build/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fnextjs-vercel-production-build%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fnextjs-vercel-production-build%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."
      }
    },
    {
      "id": "guide-dns-migration-email",
      "type": "guide",
      "title": "Move DNS without forgetting email, verification records or DNSSEC",
      "description": "Inventory the full zone, compare the destination and plan nameserver changes with the account holder instead of copying only the website record.",
      "slug": "dns-migration-email",
      "url": "/guides/dns-migration-email/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Cloudflare: DNS import and export",
          "url": "https://developers.cloudflare.com/dns/manage-dns-records/how-to/import-and-export/",
          "checked": "2026-10-10",
          "claims": [
            "Zone records can be exported and imported in BIND format.",
            "Domain-name targets must use fully qualified names; proxy metadata needs review."
          ]
        },
        {
          "label": "Cloudflare: DNSSEC",
          "url": "https://developers.cloudflare.com/dns/dnssec/",
          "checked": "2026-10-10",
          "claims": [
            "For the documented move to Cloudflare, remove the old DS record and wait its TTL before changing nameservers to avoid DNSSEC validation failures."
          ]
        }
      ],
      "related": [
        "dns-move-domain-without-email-downtime",
        "email-spf-dkim-dmarc-business-mail-in-spam",
        "email-move-cpanel-mailboxes-to-microsoft-365",
        "guide-email-authentication",
        "guide-imap-mailbox-migration"
      ],
      "sections": [
        {
          "heading": "A domain is more than its website address",
          "body": [
            "Inventory the existing DNS zone and the services using it. Website A, AAAA and CNAME records are only part of it: email needs MX and authentication records, while other systems may use verification, service-discovery or delegation records. An automated scan or a list of visible hostnames is not a complete inventory."
          ],
          "items": [
            "Ask the authorised account holder for an export and review its sensitivity before sharing.",
            "Include SPF, DKIM selectors, DMARC, relevant TXT, CAA and service records.",
            "Record current nameservers, TTLs and DNSSEC/registrar state."
          ]
        },
        {
          "heading": "Import is a starting point, not verification",
          "body": [
            "Cloudflare supports BIND-format export and import, with fully qualified domain targets. Review the resulting records and any provider-specific proxy or flattening settings; importing equivalent-looking values can still change behaviour. Compare the destination against the authorised inventory before changing delegation."
          ],
          "items": [
            "Check MX priorities and targets explicitly.",
            "Separate DNS hosting from the actual mailbox host.",
            "Plan website and mail tests using customer-authorised synthetic messages."
          ]
        },
        {
          "heading": "DNSSEC requires its own migration sequence",
          "body": [
            "Cloudflare's documented move warns that an old registrar DS record can cause validation failure if delegation changes too soon. Its procedure removes the old DS record, waits the record TTL and then changes nameservers. Follow the current provider-specific instructions with the registrar account holder; do not treat that sequence as universal for every provider migration."
          ],
          "items": [
            "Do not delete security or delegation records casually.",
            "Cached results can persist; define checks over the agreed transition window.",
            "A DNS rollback does not undo mail delivered or application data written elsewhere."
          ]
        },
        {
          "heading": "A credible outcome",
          "body": [
            "Ask for a reviewed record inventory, cutover plan, website and mail checks and an explicit recovery route. No absolute zero-downtime promise follows from copying records. Send the domain and intended providers initially, not registrar credentials; account changes require approved authority."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-imap-mailbox-migration",
        "guide-certificate-expiry-renewal",
        "guide-email-authentication",
        "tool-migration-readiness"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/dns-migration-email/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fdns-migration-email%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fdns-migration-email%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."
      }
    },
    {
      "id": "guide-email-authentication",
      "type": "guide",
      "title": "SPF, DKIM and DMARC: fix authentication without promising inbox placement",
      "description": "Identify legitimate senders, inspect alignment and separate authentication from delivery reputation and filtering.",
      "slug": "email-authentication",
      "url": "/guides/email-authentication/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Microsoft: email authentication",
          "url": "https://learn.microsoft.com/en-us/defender-office-365/email-authentication-about",
          "checked": "2026-10-10",
          "claims": [
            "SPF checks authorised MAIL FROM sources; DKIM signs message elements.",
            "DMARC adds alignment and failure-policy reporting.",
            "Forwarding can affect SPF and DMARC; authenticated email is not guaranteed delivery."
          ]
        }
      ],
      "related": [
        "email-spf-dkim-dmarc-business-mail-in-spam",
        "guide-contact-form-delivery-boundaries",
        "guide-dns-migration-email",
        "php-contact-form-emails-not-arriving"
      ],
      "sections": [
        {
          "heading": "Inventory who really sends for the domain",
          "body": [
            "Include normal staff email, the website, invoicing systems, support tools and approved marketing services. A domain can have legitimate senders that its owner forgot about. Editing authentication for only the main mailbox host can disrupt those other flows."
          ],
          "items": [
            "Keep the sending service and intended From domain for each flow.",
            "Inspect a redacted received test message's Authentication-Results.",
            "Do not send a full customer email or private message body for diagnosis."
          ]
        },
        {
          "heading": "Understand what each mechanism checks",
          "body": [
            "SPF identifies authorised sending sources for the envelope MAIL FROM domain; it does not by itself validate the visible From domain. DKIM verifies signed message elements using a signing domain. DMARC checks alignment with the visible From domain through the qualifying authentication result and supplies policy and reporting. A bare SPF pass or DKIM pass is therefore not enough to infer aligned DMARC success."
          ],
          "items": [
            "Use the provider's actual DNS values, not copied generic records.",
            "Check both direct and important forwarded paths.",
            "Treat reports as sensitive operational data."
          ]
        },
        {
          "heading": "Do not enforce a policy against unidentified senders",
          "body": [
            "A stricter DMARC policy can affect legitimate mail if sender inventory and alignment are incomplete. Have the account holder review reports and test the important sources before enforcing the agreed policy. Forwarding and message modification complicate authentication; Microsoft documents ARC and other controls for specific situations, not a universal instruction to bypass checks."
          ],
          "items": [
            "Preserve the previous records and authorised rollback plan.",
            "Avoid a blanket allowlist as an unexplained repair."
          ]
        },
        {
          "heading": "What success does and does not mean",
          "body": [
            "The agreed synthetic messages should show the intended authentication and alignment results for named sources. Microsoft explicitly says authenticated mail is not guaranteed delivery: reputation, content and recipient filtering still matter. Request authentication repair with providers and redacted header results, not a promise that every future message reaches the inbox."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-imap-mailbox-migration",
        "guide-contact-form-delivery-boundaries",
        "guide-dns-migration-email"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/email-authentication/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Femail-authentication%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Femail-authentication%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."
      }
    },
    {
      "id": "platform-github-actions",
      "type": "platform",
      "title": "GitHub Actions: understand the failed job before changing the pipeline",
      "description": "Separate workflow configuration, application defects and missing access; choose the right repair and keep the original checks meaningful.",
      "slug": "github-actions",
      "url": "/platforms/github-actions/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "GitHub: workflow run logs",
          "url": "https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/using-workflow-run-logs",
          "checked": "2026-10-10",
          "claims": [
            "Each job has step logs; browser search covers expanded steps.",
            "Runner setup logs identify the hosted image."
          ]
        },
        {
          "label": "GitHub: workflow events",
          "url": "https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows",
          "checked": "2026-10-10",
          "claims": [
            "pull_request normally tests a merge revision.",
            "Fork pull requests have restricted token access and do not receive ordinary secrets."
          ]
        }
      ],
      "related": [
        "guide-github-actions-first-failure",
        "guide-github-actions-local-pass-ci-fail",
        "example-ci-repair-evidence",
        "fix-failing-github-actions-job",
        "keep-github-actions-ci-green",
        "fix-one-bug-with-regression-test"
      ],
      "sections": [
        {
          "heading": "Three different problems can make the same job red",
          "body": [
            "A failing command can mean the runner uses a different dependency or working directory. A failing assertion can mean the application has a real defect. An authentication failure can mean an account holder needs to renew access. These are different outcomes; a green badge alone does not distinguish them."
          ],
          "items": [
            "Configuration repair: preserve the checks and make the named job execute successfully.",
            "Application repair: capture a failing regression test, then repair the behaviour it exposes.",
            "Access or provider issue: retain the redacted error and route it to the account holder; do not replace secrets in an enquiry."
          ]
        },
        {
          "heading": "Record the execution context",
          "body": [
            "Keep the workflow file name, job name, run identifier, attempt, event, tested revision and runner label together. A pull request commonly runs against a synthetic merge commit, not just the branch head. A rerun archive may contain only rerun jobs, so an earlier attempt can be needed for the baseline."
          ],
          "items": [
            "For a matrix, identify the failing operating system and runtime combination.",
            "Record the first relevant error, not only the final exit code.",
            "Before any rerun, ask whether another job on the same event deploys or has external effects."
          ]
        },
        {
          "heading": "Choose one-off repair or an ongoing responsibility",
          "body": [
            "One repeatable job with a safe branch run is a bounded repair. Several unrelated failures, intermittent tests or inaccessible runners need a broader investigation. Keeping CI green is a standing responsibility with agreed repositories, triggers, exclusions and escalation; it is not a promise that every third-party service stays available."
          ],
          "items": [
            "A skipped job, ignored failure or weakened assertion is not a repair.",
            "Merge, repository settings and production deployments stay under the customer's approval rules."
          ]
        },
        {
          "heading": "Ask for the right work",
          "body": [
            "Start with the named job, redacted error, event and whether running it can deploy. Do not send repository code, credentials or invitations in the first enquiry. We confirm scope and the authorised test route before access. Existing catalogue prices are untested hypotheses; broader or recurring work needs a written quote."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-github-actions-first-failure",
        "guide-github-actions-local-pass-ci-fail"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/platforms/github-actions/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fgithub-actions%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fplatforms%2Fgithub-actions%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."
      }
    },
    {
      "id": "guide-github-actions-first-failure",
      "type": "guide",
      "title": "Find the first useful error in a failed GitHub Actions run",
      "description": "Turn a final exit code into a bounded failure report without rerunning a deployment or sharing private logs.",
      "slug": "github-actions-first-failure",
      "url": "/guides/github-actions-first-failure/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "GitHub: workflow run logs",
          "url": "https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/using-workflow-run-logs",
          "checked": "2026-10-10",
          "claims": [
            "Failed steps can be inspected in each job.",
            "Log line links can identify an exact failure location.",
            "Search only includes expanded steps; partial-rerun logs omit jobs that did not rerun."
          ]
        }
      ],
      "related": [
        "platform-github-actions",
        "guide-github-actions-local-pass-ci-fail",
        "fix-failing-github-actions-job",
        "example-ci-repair-evidence"
      ],
      "sections": [
        {
          "heading": "Start with the existing run",
          "body": [
            "Open the repository's Actions tab, choose the failed workflow execution and select the failed job. Expand the first failed step and read the lines before the final process exit message. A generic exit code describes the result, not the underlying cause. Reading existing logs is preferable to triggering another run merely to obtain an error."
          ],
          "items": [
            "Keep the workflow, job, run ID and attempt number.",
            "For a matrix job, keep the exact failing configuration.",
            "If a dependency job failed first, investigate that upstream failure before a downstream cancellation."
          ]
        },
        {
          "heading": "Search carefully",
          "body": [
            "GitHub's browser log search only searches expanded steps. Expand the relevant steps before concluding a message is absent. If you download a partial-rerun archive, it contains only the jobs rerun in that attempt; retain earlier attempt logs when you need the complete failure sequence."
          ],
          "items": [
            "Keep enough preceding lines to explain the error, not the entire private log.",
            "Copy the line-specific link where the repository's access rules allow it.",
            "Remove tokens, private URLs, source code and customer identifiers before sharing excerpts."
          ]
        },
        {
          "heading": "Classify before changing",
          "body": [
            "A dependency install failure, missing command and compiler error point toward different checks. An explicit permission or quota message belongs with the account holder. A test that correctly detects broken application behaviour should remain red until that behaviour is fixed; disabling the test changes the question rather than answering it."
          ],
          "items": [
            "Do not enable verbose logging without considering what it can reveal.",
            "Do not rerun a workflow until its deployments and external effects are understood.",
            "Do not treat a cancelled or skipped job as a passing execution."
          ]
        },
        {
          "heading": "A useful first enquiry",
          "body": [
            "Send the workflow and job names, trigger, runner label, consistency of the failure and a redacted excerpt containing the first error. State whether a branch run is safe. That is enough to begin scoping; credentials and confidential code are not first-contact inputs."
          ],
          "items": []
        }
      ],
      "platforms": [
        "github-actions"
      ],
      "incoming": [
        "platform-github-actions",
        "example-ci-repair-evidence"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/github-actions-first-failure/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fgithub-actions-first-failure%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fgithub-actions-first-failure%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."
      }
    },
    {
      "id": "guide-github-actions-local-pass-ci-fail",
      "type": "guide",
      "title": "Why tests pass locally but fail in GitHub Actions",
      "description": "Compare runtime, revision, dependencies and privilege context before blaming the runner or weakening your tests.",
      "slug": "github-actions-local-pass-ci-fail",
      "url": "/guides/github-actions-local-pass-ci-fail/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "GitHub: workflow events",
          "url": "https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows",
          "checked": "2026-10-10",
          "claims": [
            "pull_request normally tests a merge commit.",
            "Fork and Dependabot pull requests have secret restrictions.",
            "Executing untrusted code with pull_request_target can expose privileges."
          ]
        },
        {
          "label": "GitHub: run logs",
          "url": "https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/using-workflow-run-logs",
          "checked": "2026-10-10",
          "claims": [
            "Setup logs identify hosted runner software images."
          ]
        }
      ],
      "related": [
        "platform-github-actions",
        "fix-failing-github-actions-job",
        "fix-one-bug-with-regression-test",
        "nextjs-vercel-build-fails"
      ],
      "sections": [
        {
          "heading": "Check whether the same code was tested",
          "body": [
            "A local branch-head test is not necessarily the same as a pull_request run. GitHub normally checks a synthetic merge result against the target branch. Record both the branch head and tested merge revision before comparing results. A conflict or change on the target branch can explain why the local check was not equivalent."
          ],
          "items": [
            "Compare the command, working directory and selected test configuration.",
            "Compare runtime and package-manager versions and the dependency lockfile.",
            "Read the runner setup log rather than assuming its installed tools match a laptop."
          ]
        },
        {
          "heading": "Separate environment from privilege",
          "body": [
            "Fork pull requests do not receive ordinary repository secrets and use a restricted GITHUB_TOKEN. A job expecting a private package registry or external credential can therefore fail only on that event. That is not permission to expose the secret to the contributor."
          ],
          "items": [
            "Ask whether the dependency can be tested without the private service.",
            "Document a safe maintainer-approved test route where access is essential.",
            "Do not switch to pull_request_target and execute untrusted pull-request code as an access workaround."
          ]
        },
        {
          "heading": "Choose a repeatable comparison",
          "body": [
            "Reproduce the failure in an authorised disposable environment using the recorded runtime, lockfile and command. Do not run an unfamiliar workflow just because it is labelled test: another job may deploy, send messages or use production services. If the problem is intermittent, retain several failing and passing run identities rather than pretending one lucky rerun explains it."
          ],
          "items": [
            "Configuration fixes should preserve the original trigger and checks.",
            "A genuine application assertion failure needs a regression-test repair.",
            "A private-service outage or expired secret belongs outside a bounded CI configuration repair."
          ]
        },
        {
          "heading": "What proves the repair",
          "body": [
            "The useful evidence is a successful execution of the same named job in the agreed event and runner context, plus the small reviewed diff and before-and-after error excerpts. A local pass or a green run on a different event can help investigation but cannot replace that acceptance evidence."
          ],
          "items": []
        }
      ],
      "platforms": [
        "github-actions"
      ],
      "incoming": [
        "guide-nextjs-vercel-production-build",
        "platform-github-actions",
        "guide-github-actions-first-failure"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/github-actions-local-pass-ci-fail/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fgithub-actions-local-pass-ci-fail%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fgithub-actions-local-pass-ci-fail%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."
      }
    },
    {
      "id": "example-ci-repair-evidence",
      "type": "example",
      "title": "Example evidence packet for a one-job CI repair",
      "description": "An inspectable synthetic handover outline that distinguishes a real executed pass from skipped checks or an unrelated green run.",
      "slug": "ci-repair-evidence",
      "url": "/examples/ci-repair-evidence/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "GitHub: workflow run logs",
          "url": "https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/using-workflow-run-logs",
          "checked": "2026-10-10",
          "claims": [
            "Run and job logs can be inspected and linked."
          ]
        },
        {
          "label": "GitHub: pull request events",
          "url": "https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows",
          "checked": "2026-10-10",
          "claims": [
            "A pull_request run has a tested merge revision."
          ]
        }
      ],
      "related": [
        "fix-failing-github-actions-job",
        "guide-github-actions-first-failure",
        "keep-github-actions-ci-green"
      ],
      "sections": [
        {
          "heading": "This is a synthetic packet, not client proof",
          "body": [
            "Suppose one Linux build job cannot find the application's package script because its working directory is wrong. The following outline shows the evidence a buyer should receive. It contains no real run, claimed repair, measured duration or customer result. Replace every field with actual authorised-run evidence before treating a packet as delivered work."
          ],
          "items": [
            "Request: repair the named build job; preserve its trigger, tests and runner configuration.",
            "Baseline: failed run link, attempt, job ID, event, source revision, working directory and redacted first-error excerpt.",
            "Change: the specific workflow-file diff and explanation of why the command ran in the wrong directory."
          ]
        },
        {
          "heading": "Acceptance record",
          "body": [
            "Record the after-run link, executed job conclusion and same-context comparison beside the baseline. For a pull_request event, record the tested merge SHA as well as the branch head. If a matrix is involved, name the agreed configuration; a different matrix member passing is not evidence that the failing one was repaired."
          ],
          "items": [
            "The command executes and completes; skipped, neutral and continue-on-error results are not a pass.",
            "The reviewer checks that no assertion, quality threshold or trigger was weakened.",
            "The customer can inspect the complete changed-file list and approve the merge."
          ]
        },
        {
          "heading": "Limits and reversal",
          "body": [
            "The packet states what was not tested: other jobs, other runners and any production deployment. Before merge, closing the pull request leaves the default branch unchanged. After merge, a maintainer can revert the named change under the repository's rules; reverting a workflow file does not undo external side effects from a run."
          ],
          "items": [
            "List independent review findings and unresolved exclusions.",
            "Name who is authorised to merge and who would deploy.",
            "Keep acceptance and payment evidence separate from the technical run result."
          ]
        },
        {
          "heading": "Use this outline when requesting a repair",
          "body": [
            "Ask the provider to name the original failure and prove the same job ran successfully. If the only evidence is a screenshot of a green badge, ask for the run, job, event and revision. The outline is a checklist to use with an actual repair, not a runnable fixture or a delivered project."
          ],
          "items": []
        }
      ],
      "platforms": [
        "github-actions"
      ],
      "incoming": [
        "example-shopping-list-evidence",
        "platform-github-actions",
        "guide-github-actions-first-failure"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/examples/ci-repair-evidence/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Fci-repair-evidence%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fexamples%2Fci-repair-evidence%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."
      }
    },
    {
      "id": "platform-stripe",
      "type": "platform",
      "title": "Stripe integrations: payment, subscription and access are different states",
      "description": "Understand asynchronous payment events, reliable subscription access and the boundaries of a safe test-mode integration.",
      "slug": "stripe",
      "url": "/platforms/stripe/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Stripe: webhooks",
          "url": "https://docs.stripe.com/webhooks",
          "checked": "2026-10-10",
          "claims": [
            "Webhook signature verification needs the original request body.",
            "Events can be duplicated and delivered out of order."
          ]
        },
        {
          "label": "Stripe: subscription webhooks",
          "url": "https://docs.stripe.com/billing/subscriptions/webhooks",
          "checked": "2026-10-10",
          "claims": [
            "Subscription activity is asynchronous.",
            "invoice.paid and subscription status inform provisioning; failed payments and cancellation need explicit handling."
          ]
        }
      ],
      "related": [
        "guide-stripe-webhook-delivery",
        "guide-stripe-subscription-access",
        "example-stripe-event-replay-matrix",
        "stripe-nextjs-supabase-subscriptions",
        "stripe-memberstack-access-after-payment"
      ],
      "sections": [
        {
          "heading": "A checkout redirect is not your access ledger",
          "body": [
            "The browser returning to a success page is a user-interface event. Subscription renewals, payment failures and cancellation happen later, without that browser session. An application needs an authenticated mapping between its user and Stripe customer, verified server-side events and an owner-approved access policy."
          ],
          "items": [
            "Payment state: whether an invoice or payment succeeded.",
            "Subscription state: whether the subscription is active, trialing, past_due, canceled or another supported state.",
            "Application access: the features that your product allows under your agreed rules."
          ]
        },
        {
          "heading": "Reliable event handling",
          "body": [
            "Stripe does not guarantee event order and can deliver an event more than once. Verify its signature using the unmodified request body, recognise events already processed and make business updates safe to repeat. A successful HTTP acknowledgement should not mask a lost update: if work is deferred, record it durably first."
          ],
          "items": [
            "Keep test and live destinations and signing secrets separate.",
            "Record event IDs and processing results without logging full customer payloads.",
            "Investigate the destination response before blaming checkout configuration."
          ]
        },
        {
          "heading": "Choose the actual outcome",
          "body": [
            "Adding plans to an app that has no subscription lifecycle is different from repairing paid-member access in an existing membership product. Custom card collection, marketplace payouts, tax advice and migrating an old subscriber base are separate scopes. A refund or dispute policy also needs explicit product-owner decisions; this guide does not authorise financial actions."
          ],
          "items": [
            "First prove purchase, renewal and cancellation using synthetic test accounts.",
            "Agree whether a failed renewal has a grace period; do not infer that from one event name."
          ]
        },
        {
          "heading": "Safe first contact",
          "body": [
            "Describe the platform, expected access rule and redacted event type or failure response. Do not send card data, secret keys, customer lists or full event payloads. A written scope and safe test route precede any private work or live change; the offer is enquiry-led, not an automatic payment instruction."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-stripe-webhook-delivery",
        "guide-stripe-subscription-access",
        "example-stripe-event-replay-matrix"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/platforms/stripe/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fstripe%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fplatforms%2Fstripe%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."
      }
    },
    {
      "id": "guide-stripe-webhook-delivery",
      "type": "guide",
      "title": "Stripe webhook not updating your app? Separate delivery from processing",
      "description": "Check the destination response, raw-body signature verification and durable processing before replaying payment events.",
      "slug": "stripe-webhook-delivery",
      "url": "/guides/stripe-webhook-delivery/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Stripe: webhook delivery and verification",
          "url": "https://docs.stripe.com/webhooks",
          "checked": "2026-10-10",
          "claims": [
            "Stripe documents delivery response diagnostics and retries.",
            "Signature verification requires the raw request body and the correct endpoint secret.",
            "Duplicates and unordered delivery must be handled."
          ]
        }
      ],
      "related": [
        "platform-stripe",
        "guide-stripe-subscription-access",
        "example-stripe-event-replay-matrix",
        "stripe-nextjs-supabase-subscriptions",
        "stripe-memberstack-access-after-payment"
      ],
      "sections": [
        {
          "heading": "Locate the failure boundary",
          "body": [
            "In the account holder's Stripe event-destination view, identify one event and its delivery attempt. First distinguish no subscribed event, failed HTTP delivery and successful delivery followed by an incorrect application update. The last case needs application processing evidence; repeatedly changing the destination URL will not explain it."
          ],
          "items": [
            "Confirm test versus live mode and the intended destination.",
            "Compare the subscribed event type with the event your application expects.",
            "Keep a redacted response status and event ID; do not export customer payloads for an enquiry."
          ]
        },
        {
          "heading": "When signature verification fails",
          "body": [
            "Stripe's verification needs the original request-body bytes, its signature header and the correct signing secret. Middleware that parses and reserialises JSON can change those bytes. A CLI-forwarded test event and a registered destination can have different signing secrets. The account holder should verify which secret is configured through approved secret settings, not paste it into a conversation."
          ],
          "items": [
            "Do not disable verification to make deliveries pass.",
            "Check body-handling and environment configuration on a synthetic test route.",
            "Treat a valid signature as origin verification, not as authorisation for every business action."
          ]
        },
        {
          "heading": "A successful response can still lose work",
          "body": [
            "If the handler acknowledges before recording its update or queued work, a later crash can leave Stripe reporting delivery success while access is stale. Design for a durable handoff and idempotent processing. Conversely, a timeout after a completed action can lead to delivery retries; simply processing everything again can duplicate side effects."
          ],
          "items": [
            "Recognise already-processed event IDs and use safe business-operation identity.",
            "Retrieve current relevant Stripe state rather than assuming event arrival order is chronological.",
            "Log minimal processing outcomes separately from HTTP delivery outcomes."
          ]
        },
        {
          "heading": "Replay only with a defined purpose",
          "body": [
            "Replaying a live event can repeat emails, provisioning or other financial side effects. First test duplicate handling with synthetic events and an isolated account. Then an authorised operator can agree which live events need recovery and how completion will be reconciled. Never replay the entire event history merely because one membership is wrong."
          ],
          "items": []
        }
      ],
      "platforms": [
        "stripe"
      ],
      "incoming": [
        "platform-stripe",
        "guide-stripe-subscription-access",
        "example-stripe-event-replay-matrix"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/stripe-webhook-delivery/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fstripe-webhook-delivery%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fstripe-webhook-delivery%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."
      }
    },
    {
      "id": "guide-stripe-subscription-access",
      "type": "guide",
      "title": "Keep application access correct when a Stripe subscription changes",
      "description": "Map purchase, renewal, failed payment and cancellation to an explicit access policy instead of trusting a success page.",
      "slug": "stripe-subscription-access",
      "url": "/guides/stripe-subscription-access/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Stripe: subscription webhooks",
          "url": "https://docs.stripe.com/billing/subscriptions/webhooks",
          "checked": "2026-10-10",
          "claims": [
            "customer.subscription.created can be incomplete.",
            "invoice.paid should be considered with current subscription status for access.",
            "past_due handling depends on subscription settings; canceled and unpaid require access handling.",
            "customer.subscription.deleted indicates the subscription ended."
          ]
        }
      ],
      "related": [
        "platform-stripe",
        "guide-stripe-webhook-delivery",
        "example-stripe-event-replay-matrix",
        "stripe-nextjs-supabase-subscriptions",
        "stripe-memberstack-access-after-payment"
      ],
      "sections": [
        {
          "heading": "Write the policy before implementing it",
          "body": [
            "Define the permitted features for each plan and what happens during trial, initial payment requiring action, renewal failure, grace period and cancellation. A newly created subscription can be incomplete. Granting access solely because a subscription object exists can unlock a product before the required payment or authentication is complete."
          ],
          "items": [
            "Map stable application user IDs to Stripe customers; email text alone is a fragile identity rule.",
            "Name the price IDs and plan permissions in test mode.",
            "State whether cancel-at-period-end retains access until the paid period ends."
          ]
        },
        {
          "heading": "Read current state, not just the event name",
          "body": [
            "Stripe documents using invoice.paid together with the relevant subscription status when extending access. A failed renewal is not automatically identical to permanent cancellation: retry and final-status settings affect what happens next. Your product's grace policy must be explicit rather than inferred from the latest-arriving webhook."
          ],
          "items": [
            "Handle customer.subscription.updated when rules or status change.",
            "Handle ended subscriptions and the owner-approved unpaid/canceled behaviour.",
            "Do not treat paused payment collection and a paused subscription as interchangeable."
          ]
        },
        {
          "heading": "Check both permitted and denied behaviour",
          "body": [
            "Testing only the successful purchase leaves the dangerous cases unexamined. Use disposable accounts and synthetic data to test renewal, payment requiring action, failed renewal, scheduled cancellation and actual subscription end. Inspect protected server routes as well as visible screens; hiding a button does not enforce access."
          ],
          "items": [
            "An unrelated account must never inherit another customer's plan.",
            "Replay a processed event and check that access and subscription rows are not duplicated.",
            "Deliver older events after newer ones and verify the agreed current state remains authoritative."
          ]
        },
        {
          "heading": "What to send for an access repair",
          "body": [
            "Describe expected versus observed access and the redacted event type, mode and response. State the membership platform and whether the issue affects purchase, renewal or cancellation. Do not send member identities, card data or secret keys. Recovery of real customers and any financial action require separately agreed authority."
          ],
          "items": []
        }
      ],
      "platforms": [
        "stripe"
      ],
      "incoming": [
        "platform-stripe",
        "guide-stripe-webhook-delivery",
        "example-stripe-event-replay-matrix"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/stripe-subscription-access/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fstripe-subscription-access%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fstripe-subscription-access%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."
      }
    },
    {
      "id": "example-stripe-event-replay-matrix",
      "type": "example",
      "title": "Synthetic test matrix for duplicate and out-of-order Stripe events",
      "description": "Inspect the cases a subscription integration should handle; this example is a test specification, not a customer project or runnable tool.",
      "slug": "stripe-event-replay-matrix",
      "url": "/examples/stripe-event-replay-matrix/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Stripe: webhook guarantees and limits",
          "url": "https://docs.stripe.com/webhooks",
          "checked": "2026-10-10",
          "claims": [
            "Events can be delivered more than once and out of order.",
            "Event signature verification is required."
          ]
        },
        {
          "label": "Stripe: subscription events",
          "url": "https://docs.stripe.com/billing/subscriptions/webhooks",
          "checked": "2026-10-10",
          "claims": [
            "Access rules must account for asynchronous subscription changes."
          ]
        }
      ],
      "related": [
        "platform-stripe",
        "guide-stripe-webhook-delivery",
        "guide-stripe-subscription-access",
        "stripe-nextjs-supabase-subscriptions"
      ],
      "sections": [
        {
          "heading": "Fixture assumptions",
          "body": [
            "This is an authored synthetic test specification, not an executed integration or client result. Use two disposable app users, one test subscription per user and a documented access policy. All events must use a test route; this specification does not require real customer data or live billing actions."
          ],
          "items": [
            "User A buys the test plan; User B has no plan and must remain blocked.",
            "The test policy grants access after the agreed payment and current-subscription checks.",
            "The policy states what happens on past_due and on actual subscription end."
          ]
        },
        {
          "heading": "Replay cases and expected invariants",
          "body": [
            "Expected results are assertions to implement, not evidence that they already pass. Capture the redacted event ID, processing result and before-and-after state for each case."
          ],
          "items": [
            "Same event twice: the second delivery produces no duplicate entitlement, notification or subscription row.",
            "Different events about the same business transition: operation-level safeguards prevent repeating a non-repeatable side effect.",
            "Older update after cancellation: the handler checks authoritative current state and does not resurrect ended access.",
            "Unknown user mapping: no other account is updated; the event is retained for a controlled exception route.",
            "Invalid signature: no access mutation occurs."
          ]
        },
        {
          "heading": "Crash and recovery cases",
          "body": [
            "Simulate a worker stopping after durable receipt but before the access update, then resume processing. Separately simulate a completed update before acknowledgement and deliver the event again. These cases test whether receipt, processing and completion have distinct recoverable states instead of relying on an HTTP success alone."
          ],
          "items": [
            "Recovery either completes the intended update once or exposes a clearly recorded exception.",
            "No test sends a real email, charge, refund or production entitlement.",
            "The review compares event history with both allowed and denied app requests."
          ]
        },
        {
          "heading": "What remains outside the example",
          "body": [
            "This matrix does not validate tax handling, disputes, Connect payouts, financial reconciliation or an existing membership vendor's entire behaviour. It illustrates the reliability checks needed around a subscription integration. A runnable implementation and independent exercise would be separate evidence; neither is claimed here."
          ],
          "items": []
        }
      ],
      "platforms": [
        "stripe"
      ],
      "incoming": [
        "platform-stripe",
        "guide-stripe-webhook-delivery",
        "guide-stripe-subscription-access"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/examples/stripe-event-replay-matrix/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fexamples%2Fstripe-event-replay-matrix%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fexamples%2Fstripe-event-replay-matrix%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."
      }
    },
    {
      "id": "platform-wordpress-woocommerce",
      "type": "platform",
      "title": "WordPress and WooCommerce repair: protect the live store while finding the conflict",
      "description": "Differentiate a critical error from a checkout regression and test an isolated cause without experimenting on live orders.",
      "slug": "wordpress-woocommerce",
      "url": "/platforms/wordpress-woocommerce/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "WordPress: debugging",
          "url": "https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/",
          "checked": "2026-10-10",
          "claims": [
            "Debug logging and display can be separated; debug tools are intended for development or staging."
          ]
        },
        {
          "label": "WooCommerce: conflict testing",
          "url": "https://woocommerce.com/document/how-to-test-for-conflicts/",
          "checked": "2026-10-10",
          "claims": [
            "Backup and staging precede theme/plugin conflict isolation.",
            "Must-use plugins and drop-ins can remain active during ordinary plugin isolation."
          ]
        }
      ],
      "related": [
        "guide-wordpress-critical-error-triage",
        "guide-woocommerce-checkout-conflicts",
        "wordpress-critical-error-after-update",
        "woocommerce-checkout-after-update",
        "hosting-offsite-backups-with-restore-test"
      ],
      "sections": [
        {
          "heading": "Start with what the visitor cannot do",
          "body": [
            "A critical error or HTTP 500 concerns the site's execution. A store that loads but cannot complete checkout has a different failure and acceptance test. Write the exact visitor sequence, affected product or page, first observed time and preceding update before changing plugins."
          ],
          "items": [
            "Critical error: inspect existing application and host logs for a first relevant fatal error.",
            "Checkout failure: record whether failure occurs at cart, address, shipping, payment or order confirmation.",
            "Keep customer details and payment information out of screenshots and enquiry logs."
          ]
        },
        {
          "heading": "A staging copy is not automatically harmless",
          "body": [
            "WooCommerce recommends a staging copy and backups for conflict testing. A clone can still contain live payment, email or integration settings. Agree an isolated test route, synthetic orders and disabled external effects before testing; merely changing the hostname does not make a copy safe."
          ],
          "items": [
            "Keep a known restore point and name who can restore it.",
            "Use a test payment configuration approved by the account holder.",
            "Do not copy real customer records into an agent's workspace."
          ]
        },
        {
          "heading": "Find a cause, not a lucky combination",
          "body": [
            "Compare the theme and plugin combinations systematically and repeat the same failing sequence. Host-managed must-use plugins, drop-ins and caches can survive ordinary deactivation. Record each combination and result; if re-enabling a component restores the failure, that is more useful than leaving everything disabled."
          ],
          "items": [
            "Do not remove essential checkout capabilities simply to obtain a passing demonstration.",
            "After a fix, check an unaffected path as well as the original regression."
          ]
        },
        {
          "heading": "Choose an accountable repair",
          "body": [
            "Request the named broken flow with a redacted error and change history. The scope should state included components, exclusions, test-order evidence, reversal and who approves a live change. This is a newly offered service catalogue, not evidence of previous customer deliveries or guaranteed conversion improvement."
          ],
          "items": []
        }
      ],
      "incoming": [
        "guide-wordpress-critical-error-triage",
        "guide-woocommerce-checkout-conflicts"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/platforms/wordpress-woocommerce/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fwordpress-woocommerce%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fplatforms%2Fwordpress-woocommerce%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."
      }
    },
    {
      "id": "guide-wordpress-critical-error-triage",
      "type": "guide",
      "title": "WordPress critical error after an update: collect evidence without exposing debug output",
      "description": "Use existing logs and an isolated test copy to identify the first fatal error instead of disabling every plugin on the live site.",
      "slug": "wordpress-critical-error-triage",
      "url": "/guides/wordpress-critical-error-triage/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "WordPress: debugging",
          "url": "https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/",
          "checked": "2026-10-10",
          "claims": [
            "WP_DEBUG_LOG can record errors while WP_DEBUG_DISPLAY is false.",
            "Boolean false is different from the nonempty string 'false'.",
            "Debug tools are intended for local or staging use."
          ]
        }
      ],
      "related": [
        "platform-wordpress-woocommerce",
        "wordpress-critical-error-after-update",
        "php-7-site-to-php-8",
        "hosting-offsite-backups-with-restore-test"
      ],
      "sections": [
        {
          "heading": "Preserve the first error and the change history",
          "body": [
            "Record what changed immediately before the problem: plugin, theme, WordPress or PHP version. Ask the authorised administrator to inspect existing PHP or WordPress logs first. Preserve a short redacted fatal-error excerpt with its time and component name. An HTTP 500 by itself does not identify the cause."
          ],
          "items": [
            "Do not repeatedly update or deactivate live components before recording the baseline.",
            "Do not share full logs containing visitors, filesystem paths, tokens or private data.",
            "If admin access is also broken, ask the host or maintainer for its authorised recovery route."
          ]
        },
        {
          "heading": "Keep debug messages away from visitors",
          "body": [
            "WordPress documents separating logging from display: with debugging enabled on a development or staging copy, WP_DEBUG_LOG can record messages while WP_DEBUG_DISPLAY is false. Settings use actual booleans; the quoted string 'false' is a nonempty string and can act as true. A staging log still needs controlled access and redaction."
          ],
          "items": [
            "Place settings in the documented wp-config.php position through an authorised maintainer.",
            "Do not display internal errors on the public page.",
            "Disable investigative logging once it has served its purpose and retain only necessary redacted evidence."
          ]
        },
        {
          "heading": "Prove the suspected component",
          "body": [
            "Reproduce the same failure on a safe copy with the recorded versions. Use the error location to choose a focused comparison, such as the preceding plugin version or supported theme. A site loading after every plugin is disabled is not proof that its booking, checkout or membership functionality was repaired."
          ],
          "items": [
            "Check the original visitor flow after the change.",
            "Check admin access and one unaffected path.",
            "Identify any data or configuration changes that a code rollback will not reverse."
          ]
        },
        {
          "heading": "When to stop",
          "body": [
            "Stop ordinary update troubleshooting if evidence suggests a compromise, unknown privileged changes or untrusted injected code. That requires a security incident scope, not a routine compatibility repair. For a normal error enquiry, send platform versions, affected flow and the redacted first error, never logins or a production backup."
          ],
          "items": []
        }
      ],
      "platforms": [
        "wordpress-woocommerce"
      ],
      "incoming": [
        "platform-wordpress-woocommerce",
        "guide-woocommerce-checkout-conflicts"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/wordpress-critical-error-triage/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fwordpress-critical-error-triage%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fwordpress-critical-error-triage%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."
      }
    },
    {
      "id": "guide-woocommerce-checkout-conflicts",
      "type": "guide",
      "title": "Diagnose WooCommerce checkout conflicts after an update",
      "description": "Isolate the failing theme or plugin on staging and prove the same product, shipping and test-payment journey works again.",
      "slug": "woocommerce-checkout-conflicts",
      "url": "/guides/woocommerce-checkout-conflicts/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "WooCommerce: conflict testing",
          "url": "https://woocommerce.com/document/how-to-test-for-conflicts/",
          "checked": "2026-10-10",
          "claims": [
            "Backups and a staging copy are recommended before conflict tests.",
            "Testing a standard theme and isolating plugins helps locate conflicts.",
            "Must-use plugins, drop-ins and caching can affect the result."
          ]
        }
      ],
      "related": [
        "platform-wordpress-woocommerce",
        "woocommerce-checkout-after-update",
        "guide-wordpress-critical-error-triage",
        "buyer-ecommerce-owner-checkout"
      ],
      "sections": [
        {
          "heading": "Define the failing checkout",
          "body": [
            "Record the product, quantity, address category, shipping option and payment method used when failure occurs. Distinguish missing rates, a payment-widget error, rejected payment and an order that exists but shows an unexpected status. Each demands different evidence; 'checkout broken' is too broad for acceptance."
          ],
          "items": [
            "Use synthetic customer details and a test payment method.",
            "Record the visible error and any redacted application error.",
            "Note whether the issue affects every checkout or one product, country or method."
          ]
        },
        {
          "heading": "Prepare the isolated test",
          "body": [
            "WooCommerce's conflict guide starts with backup and staging. The account holder should ensure the copy cannot send real order emails, collect live payment or update a live fulfilment system. Keep the current baseline so a theme or plugin comparison can be reversed. Wholesale live updates or deactivation are not safe diagnostic shortcuts."
          ],
          "items": [
            "Confirm which payment and shipping extensions are needed to reproduce this checkout.",
            "Record WordPress, WooCommerce, theme and relevant plugin versions.",
            "Understand whether the store uses a block or classic checkout before changing its presentation."
          ]
        },
        {
          "heading": "Test one variable at a time",
          "body": [
            "Try an appropriate standard theme on the copy, then isolate nonessential plugins while retaining WooCommerce and the extensions necessary for the test. Repeat the same product-and-payment sequence. Re-enable components individually and record when the error returns. Check must-use plugins, drop-ins and caching if ordinary isolation does not explain it."
          ],
          "items": [
            "A passing test after removing the required shipping or payment method is not the same test.",
            "Do not assume a stale cached page proves the fix failed or passed."
          ]
        },
        {
          "heading": "What a useful repair handover contains",
          "body": [
            "Keep the failing and passing synthetic order journey, cause, changed files or settings and an independently reviewed reversal plan. Check that the agreed order is created once with expected totals and status; do not call a payment-page screenshot completed checkout. Real transactions and production publication remain separate authorised steps."
          ],
          "items": []
        }
      ],
      "platforms": [
        "wordpress-woocommerce"
      ],
      "incoming": [
        "buyer-ecommerce-owner-checkout",
        "platform-wordpress-woocommerce"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/guides/woocommerce-checkout-conflicts/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fguides%2Fwoocommerce-checkout-conflicts%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fguides%2Fwoocommerce-checkout-conflicts%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."
      }
    },
    {
      "id": "platform-shopify",
      "type": "platform",
      "title": "Shopify theme and app changes: preserve storefront behaviour, not just appearance",
      "description": "Understand theme-update carryover, app-code remnants and the evidence needed to repair an existing storefront safely.",
      "slug": "shopify",
      "url": "/platforms/shopify/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Shopify: theme updates",
          "url": "https://help.shopify.com/en/manual/online-store/themes/managing-themes/updating-themes",
          "checked": "2026-10-10",
          "claims": [
            "Theme updates create a draft before publication.",
            "Custom or app-generated code transfers only when compatible.",
            "Custom CSS and app compatibility should be rechecked."
          ]
        },
        {
          "label": "Shopify: uninstalling apps",
          "url": "https://help.shopify.com/en/manual/apps/uninstalling-apps",
          "checked": "2026-10-10",
          "claims": [
            "App uninstall can leave theme code.",
            "Separately billed subscriptions may need cancellation outside Shopify."
          ]
        }
      ],
      "related": [
        "guide-shopify-theme-update-regression",
        "guide-shopify-app-uninstall-cleanup",
        "shopify-product-tab-after-theme-update",
        "shopify-uninstalled-review-app-residue",
        "shopify-merchant-brand-identifier"
      ],
      "sections": [
        {
          "heading": "Theme settings and custom code have different lifecycles",
          "body": [
            "A theme update can carry editor customisations forward while incompatible hand-edited or app-generated code does not transfer. A product tab disappearing therefore needs a comparison of the old theme, updated draft and the custom feature; simply republishing the new version is not a diagnosis."
          ],
          "items": [
            "Identify the exact product template and lost behaviour.",
            "Review the update's code-transfer status and release notes.",
            "Keep the old theme available as a reference before publishing a draft."
          ]
        },
        {
          "heading": "An uninstall is not complete storefront cleanup",
          "body": [
            "Shopify warns that app code can remain in the theme after uninstall. Removing a review app also raises a data question: what review content or export needs preserving? The app developer's cleanup instructions and billing controls matter; Shopify uninstall does not necessarily cancel a separately billed service."
          ],
          "items": [
            "Name the removed app and affected snippets or widgets without sharing account access.",
            "Preserve any authorised export before deleting display code.",
            "Check unrelated storefront features that share the modified template."
          ]
        },
        {
          "heading": "Keep catalogue and feed problems separate",
          "body": [
            "A storefront layout regression is not the same as a product-feed rejection for identifiers. Brand and identifier correction needs the actual channel's rejection reason and product facts. Do not invent a GTIN or brand merely to clear a warning; the separate catalogue outcome covers a different deliverable and acceptance test."
          ],
          "items": [
            "Preview themes before live publication.",
            "Do not place test orders, change billing or install apps without the account holder's authority."
          ]
        },
        {
          "heading": "Request a bounded change",
          "body": [
            "Describe the named product page, old and new behaviour, theme versions and preceding app or theme change. Public links and redacted screenshots are useful first-contact inputs. No staff invitation, private export or credentials are needed for the initial enquiry; the proposed work is scoped and quoted before access."
          ],
          "items": []
        }
      ],
      "incoming": [
        "buyer-ecommerce-owner-checkout",
        "guide-merchant-brand-identifiers",
        "guide-shopify-theme-update-regression",
        "guide-shopify-app-uninstall-cleanup"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/platforms/shopify/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Fplatforms%2Fshopify%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Fplatforms%2Fshopify%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."
      }
    },
    {
      "id": "tool-migration-readiness",
      "type": "tool",
      "tool_kind": "migration-readiness",
      "title": "Migration prerequisites checklist: identify what you have not checked",
      "description": "Answer five yes/no/unknown questions about restore, staging, business checks, rollback and authority. This reports your answers, not production readiness.",
      "slug": "migration-readiness",
      "url": "/tools/migration-readiness/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Checklist implementation",
          "path": "opportunities/demand-engine/assets/demand.js",
          "checked": "2026-10-10",
          "claims": [
            "The migration form reports every prerequisite not answered yes, including unknown answers.",
            "It does not calculate a risk score or inspect the application."
          ]
        },
        {
          "label": "Django: deployment checklist",
          "url": "https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/",
          "checked": "2026-10-10",
          "claims": [
            "Application deployment needs checks beyond merely having a running server, including security and backups."
          ]
        }
      ],
      "related": [
        "guide-backup-restore-evidence",
        "example-migration-acceptance-packet",
        "guide-django-incremental-upgrade",
        "hosting-custom-php-site-off-cpanel",
        "guide-dns-migration-email"
      ],
      "sections": [
        {
          "heading": "What you are answering",
          "body": [
            "Have you tested a recent backup restore? Is an isolated staging copy available? Have you named the critical business flows and expected results? Is there a rollback decision point and route? Is an authorised owner responsible for the switch and acceptance? Select unknown when you have not verified a prerequisite rather than treating uncertainty as yes."
          ],
          "items": [
            "A backup file alone is not a restore test.",
            "A staging copy must not silently send mail, charge cards or alter customer systems.",
            "Rollback must account for new writes, not only old code."
          ]
        },
        {
          "heading": "How to read the output",
          "body": [
            "Each no or unknown response produces a prerequisite to resolve. If all five are yes, the output says you confirmed them; it does not independently verify them. There is no invented percentage score, estimated duration or assurance that the migration is safe. Compatibility, data integrity, capacity, security and live-change authority need their own checks."
          ],
          "items": [
            "Do not schedule a production switch from this result alone.",
            "Keep the evidence for each yes answer in the actual migration brief."
          ]
        },
        {
          "heading": "Privacy and scope",
          "body": [
            "The checklist accepts only prerequisite choices, not application files, logs or credentials. Its inspected implementation handles these choices in the browser and has no submission or storage path for them. Reset clears the displayed result; this is not a customer assessment retained by Synthetic Industry."
          ],
          "items": [
            "Do not send passwords, dumps or private code through an enquiry.",
            "If requesting help, describe the unresolved prerequisite and desired outcome."
          ]
        },
        {
          "heading": "Prepare an actionable migration request",
          "body": [
            "Send the source and target platform, included database/files and critical flow, plus which prerequisites remain unknown. Scope and price are agreed before private work. Customer account control and live approval remain separate from the software delivery route."
          ],
          "items": []
        }
      ],
      "platforms": [
        "laravel"
      ],
      "incoming": [
        "guide-backup-restore-evidence",
        "example-migration-acceptance-packet",
        "guide-php8-compatibility-checklist",
        "platform-laravel",
        "guide-django-incremental-upgrade"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/tools/migration-readiness/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Ftools%2Fmigration-readiness%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Ftools%2Fmigration-readiness%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."
      }
    },
    {
      "id": "tool-workflow-value",
      "type": "tool",
      "tool_kind": "workflow-value",
      "title": "Workflow time-value calculator: show the assumptions behind automation payback",
      "description": "Use your own time, volume, cost and running-cost inputs to calculate simple monthly value and payback; not a quote or guaranteed saving.",
      "slug": "workflow-value",
      "url": "/tools/workflow-value/",
      "version": 1,
      "lifecycle": "candidate",
      "updated": "2026-10-10",
      "provenance": [
        {
          "label": "Calculator implementation",
          "path": "opportunities/demand-engine/assets/demand.js",
          "checked": "2026-10-10",
          "claims": [
            "Hours equal minutes per case times cases per month divided by 60.",
            "Gross monthly time value equals those hours times hourly cost; net subtracts monthly running cost.",
            "Payback is setup cost divided by positive net monthly value; otherwise there is no positive payback.",
            "Inputs must be finite non-negative numbers no greater than 100000000."
          ]
        }
      ],
      "related": [
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping",
        "zapier-sheets-to-xero-missing-columns",
        "zapier-facebook-leads-to-salesforce"
      ],
      "sections": [
        {
          "heading": "Enter savings, not total workflow duration",
          "body": [
            "Use the minutes you expect to remove from each case, not all minutes currently spent if checking and exceptions will remain. Supply cases per month, hourly cost, one-time setup cost and monthly running cost. All monetary values must use the same currency. Your inputs are assumptions; the page has no measured volume, provider benchmark or quoted service price."
          ],
          "items": [
            "Use observed baseline timing when available.",
            "Subtract expected exception-handling and review effort from the minutes saved.",
            "Include provider fees in running cost where applicable."
          ]
        },
        {
          "heading": "The arithmetic",
          "body": [
            "Monthly hours = minutes saved per case × monthly cases ÷ 60. Gross monthly time value = hours × hourly cost. Net monthly value = gross value − monthly running cost. Simple payback = setup cost ÷ positive net monthly value. A zero or negative net value has no positive payback under these assumptions."
          ],
          "items": [
            "Worked arithmetic, not an observed case: 10 minutes × 120 cases ÷ 60 = 20 hours.",
            "At 30 per hour, gross value is 600; running cost of 100 leaves 500.",
            "Setup cost of 1500 divided by 500 gives three months; none of these inputs is our quote or a proven saving."
          ]
        },
        {
          "heading": "Time value is not cash received",
          "body": [
            "Freed time may allow other work without reducing payroll. Taxes, financing, changing volumes, implementation delays and new ongoing exceptions are not modelled. A positive result does not prove that an integration can be safely delivered or that a buyer will pay for it. Test the complete business record and duplicate behaviour separately."
          ],
          "items": [
            "Compare conservative and optimistic input assumptions.",
            "Measure the actual workflow after an authorised delivery before claiming savings."
          ]
        },
        {
          "heading": "Local calculation and its limits",
          "body": [
            "The inspected calculator computes from numeric browser inputs; it does not submit or store these values. Do not enter confidential figures if you do not want them visible on your screen. An enquiry separately opens an email draft for you to review and send, not an automatic payment or quote."
          ],
          "items": []
        }
      ],
      "incoming": [
        "buyer-finance-manager-invoice-integration",
        "guide-zapier-field-mapping"
      ],
      "request": {
        "method": "email",
        "to": "hello@syntheticindustry.ai",
        "headers": {
          "SI-Outcome": "custom-outcome",
          "SI-Mode": "request",
          "SI-Page": "https://syntheticindustry.ai/tools/workflow-value/",
          "SI-Ref": "unknown"
        },
        "url": "https://syntheticindustry.ai/request/?outcome=custom-outcome&source=%2Ftools%2Fworkflow-value%2F",
        "mailto": "mailto:hello@syntheticindustry.ai?subject=custom-outcome&body=SI-Outcome%3A%20custom-outcome%0ASI-Mode%3A%20request%0ASI-Page%3A%20https%3A%2F%2Fsyntheticindustry.ai%2Ftools%2Fworkflow-value%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."
      }
    }
  ]
}
