{
  "schemaVersion": 1,
  "decisionId": "BBI-001",
  "title": "Build, buy or integrate: a fictional service-business decision",
  "publishedDate": "2026-10-02",
  "articlePath": "/blog/build-buy-or-integrate",
  "status": "proposed-fictional-decision",
  "disclosure": "An independently invented scenario, not an anonymized client project. All business details, capabilities, costs and estimates are synthetic assumptions. No implementation, vendor test, market-price research or measured business outcome is reported.",
  "artifactType": "inspectable-specification-not-an-executable-estimator",
  "scenario": {
    "fictionalBusiness": "Bellweather acoustic-survey studio",
    "staffCount": 14,
    "coordinatorCount": 2,
    "completedJobsPerMonth": 100,
    "currentProcess": "A coordinator copies signed-off job references and billing information from a job tracker into a billing tool, then checks for missed jobs.",
    "requiredOutcome": "Every signed-off job is visible in a billing queue with a draft invoice or an explicit exception for a person to resolve.",
    "humanApprovalRequired": true,
    "outOfScope": ["Collecting payments", "Replacing the survey process", "Automating professional judgment"],
    "transferredFields": ["jobId", "signOffStatus", "billingCode", "amount"],
    "excludedData": ["Survey recordings", "Report documents"]
  },
  "constraints": {
    "pilotDeadlineWeeks": 6,
    "engineeringHoursPerWeek": 8,
    "availableSetupHours": 48,
    "maximumTechnicalMaintenanceHoursPerMonth": 4,
    "incrementalBudgetUsd": 15000,
    "operatingHorizonMonthsAfterLaunch": 12,
    "businessOwner": "Fictional operations manager",
    "technicalOwner": "Fictional engineer assigned to setup and ongoing maintenance",
    "requiredBehavior": [
      "Account for every eligible job",
      "Expose invalid or uncertain outcomes",
      "Require human invoice approval",
      "Export job references and processing outcomes in a documented format"
    ]
  },
  "costModel": {
    "currency": "USD",
    "assumedEngineeringHourlyValue": 100,
    "formula": "(setupHours + operatingHorizonMonthsAfterLaunch * maintenanceHoursPerMonth) * assumedEngineeringHourlyValue + annualPlatformOrHostingAllowance",
    "included": ["Incremental technical setup", "Technical testing and handover", "Twelve months of technical maintenance after launch", "Incremental platform or hosting allowance"],
    "excludedCommonCosts": ["Existing licenses", "Unchanged human invoice review"],
    "caution": "All rates, allowances and effort estimates are invented planning inputs, not vendor quotations or market prices. Add any newly discovered operating burden and re-evaluate. The horizon includes implementation plus twelve months of post-launch operation."
  },
  "unverifiedCapabilityAssumptions": [
    "The current job tracker provides stable job identifiers and a way to read completed jobs.",
    "The current billing tool can create and find draft invoices by an external job reference.",
    "The candidate purchased suite meets the same required behavior through its included connector.",
    "Data export and human invoice approval are available in each candidate option."
  ],
  "options": [
    {
      "id": "build",
      "scope": "Replace the job tracker with a custom application and connect it to billing.",
      "setupHours": 150,
      "maintenanceHoursPerMonth": 6,
      "annualPlatformOrHostingAllowance": 1200,
      "calculatedIncrementalCost": 23400,
      "baselineConstraintResult": "ineligible",
      "failedConstraints": ["Setup capacity", "Maintenance capacity", "Budget"]
    },
    {
      "id": "buy",
      "scope": "Move jobs to a purchased suite with an included billing connector.",
      "setupHours": 32,
      "maintenanceHoursPerMonth": 2,
      "annualPlatformOrHostingAllowance": 6000,
      "calculatedIncrementalCost": 11600,
      "baselineConstraintResult": "eligible-if-capability-assumptions-are-validated",
      "failedConstraints": []
    },
    {
      "id": "integrate",
      "scope": "Keep both tools and add a small billing-queue adapter.",
      "setupHours": 36,
      "maintenanceHoursPerMonth": 3,
      "annualPlatformOrHostingAllowance": 1200,
      "calculatedIncrementalCost": 8400,
      "baselineConstraintResult": "eligible-if-capability-assumptions-are-validated",
      "failedConstraints": []
    }
  ],
  "decisionCriteria": {
    "first": "Reject any option that fails required behavior, setup capacity, maintenance capacity, budget or ownership.",
    "then": "Compare eligible options on incremental cost, migration burden, disruption to daily work, recoverability and exit capability. No weighted score is used.",
    "preferredOption": "integrate",
    "preferenceReasons": ["Meets baseline limits under stated assumptions", "Keeps the existing job tracker", "Limits the operational change to the billing handoff", "Illustrative incremental cost is 3200 USD below buying"],
    "acceptedTradeoff": "The business owns a connection that can break when either tool changes. Lower cost is not a support guarantee.",
    "setupHeadroomHours": 12,
    "approvalGate": "Validate the assumed capabilities and complete handoff with invented records before committing the full budget.",
    "revisitTriggers": ["A required capability is absent", "An estimate exceeds a constraint", "The maintenance owner changes", "The existing tracker becomes the constraint"]
  },
  "proposedAcceptanceCases": [
    { "input": "One signed-off job", "requiredObservation": "One draft invoice with the correct job reference and amount, visible for approval." },
    { "input": "The same job arrives twice", "requiredObservation": "Find the existing draft or withhold another creation. Do not silently produce another invoice." },
    { "input": "A create request times out", "requiredObservation": "Mark the outcome uncertain and check for an existing draft before retrying. Require human reconciliation if the outcome cannot be established." },
    { "input": "Billing information is missing", "requiredObservation": "Create no draft. Explain the missing information and its owner in the queue." },
    { "input": "A job is corrected after a draft exists", "requiredObservation": "Flag the mismatch for review. Do not silently rewrite approved invoices." },
    { "input": "One tool is unavailable", "requiredObservation": "Keep the backlog visible and reconcilable. Sending a request does not establish success." }
  ],
  "sensitivityCases": [
    {
      "change": { "maximumTechnicalMaintenanceHoursPerMonth": 2 },
      "result": "Prefer buy if its assumed maintenance burden and required capabilities are validated; integrate exceeds the new maintenance limit."
    },
    {
      "change": { "existingBillingToolCanCreateAndFindDraftByJobReference": false },
      "result": "Integrate fails a required capability. Prefer buy only if the included connector demonstrates equivalent complete behavior; otherwise neither is approved."
    },
    {
      "change": { "pilotDeadlineWeeks": 2, "availableSetupHours": 16 },
      "result": "Neither buy nor integrate meets setup capacity. Keep manual handling while narrowing and re-estimating a smaller first step."
    },
    {
      "change": { "incrementalBudgetUsd": 5000 },
      "result": "No option fits. Improve the manual checklist and exception ownership, then reassess scope and funding."
    },
    {
      "change": { "requiredWorkflowRepresentableByExistingOrPurchasedTools": false },
      "result": "Reassess custom development, but it becomes eligible only when setup capacity, maintenance ownership and budget also fit."
    }
  ],
  "executionStatus": "No scenario implementation or acceptance cases have been executed. Cost values are arithmetic over the illustrative inputs, not observed outcomes."
}
