{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "kind": "deskforeman.capability-registry",
  "version": "1.0.0",
  "updatedAt": "2026-07-09",
  "release": {
    "name": "Builder-controlled SMS pilot",
    "releaseGate": "inquiry → discovery → builder-approved ballpark → customer acceptance → builder-confirmed visit → reminder → post-visit handoff",
    "statusDefinitions": {
      "live": "Implemented and available in the pilot without a manual substitute.",
      "manual_pilot": "Available only with explicit builder or DeskForeman team review.",
      "beta": "Implemented for controlled testing but not promised for every pilot customer.",
      "planned": "Not included in the current pilot."
    }
  },
  "capabilities": [
    {
      "id": "customer_sms_discovery",
      "name": "Customer SMS discovery",
      "status": "live",
      "owner": "Product",
      "proof": "Customer conversations collect and retain project facts through the production SMS path.",
      "constraints": [
        "Customer initiates the conversation.",
        "Maya identifies herself as the builder's AI assistant in the first automated reply.",
        "High-risk facts remain builder-controlled."
      ],
      "approvedPublicCopy": "Maya handles customer discovery by text, remembers the details already shared, and keeps the conversation focused on one useful next step."
    },
    {
      "id": "builder_sms_decisions",
      "name": "Builder decisions by SMS",
      "status": "live",
      "owner": "Product",
      "proof": "Builder questions and approvals are routed through the production SMS workflow and recorded for review.",
      "constraints": [
        "A builder can approve, change, reject, pause, or take over.",
        "Customer-visible price and schedule claims require the matching builder decision."
      ],
      "approvedPublicCopy": "When Maya needs a price, timing, or project decision, the builder gets a compact text with the customer context and outgoing-message preview."
    },
    {
      "id": "builder_authored_ballpark",
      "name": "Builder-authored ballpark",
      "status": "manual_pilot",
      "owner": "Pilot operations",
      "proof": "The pilot can prepare a scope brief and send only the range and assumptions approved by the builder.",
      "constraints": [
        "DeskForeman does not calculate or invent a customer price.",
        "Changes create a new revision and require a new approval.",
        "Every range is clearly described as planning guidance rather than a final quote."
      ],
      "approvedPublicCopy": "Maya prepares the scope; the builder supplies or revises the ballpark; Maya shares only the approved revision."
    },
    {
      "id": "maya_drafted_ballpark",
      "name": "Maya-drafted ballpark, builder-approved",
      "status": "planned",
      "owner": "Product",
      "proof": "Not built. Requires a drafting basis, internal-only persistence of the draft, builder approval capture, and calibration from the approved-versus-drafted delta.",
      "constraints": [
        "The drafted number is internal. A customer sees a figure only after the builder approves that exact revision.",
        "Maya asks the estimate-impact questions before drafting; an under-informed draft is worse than no draft.",
        "Each builder correction is retained as calibration signal for later drafts on that tenant.",
        "This is not automatic pricing: Maya never quotes a customer a number of her own."
      ],
      "approvedPublicCopy": "Not approved for public use while status is planned."
    },
    {
      "id": "builder_confirmed_visit",
      "name": "Builder-confirmed visit",
      "status": "manual_pilot",
      "owner": "Pilot operations",
      "proof": "The pilot can collect preferences, route candidate windows, and announce a visit after builder confirmation.",
      "constraints": [
        "DeskForeman does not read or write a builder calendar.",
        "A customer preference is not a confirmed appointment.",
        "Reminder language requires a tracked reminder commitment."
      ],
      "approvedPublicCopy": "Maya collects visit preferences and confirms a visit only after the builder approves the exact time."
    },
    {
      "id": "post_visit_handoff",
      "name": "Post-visit handoff",
      "status": "manual_pilot",
      "owner": "Pilot operations",
      "proof": "The production visit workflow accepts a stable V-coded outcome, opens an immutable A-coded next-step approval, and sends only that exact approved revision.",
      "constraints": [
        "Proposal and contract automation are not included.",
        "Maya does not promise when a builder will send a document unless that follow-up is tracked."
      ],
      "approvedPublicCopy": "After the visit, Maya organizes the known scope and asks the builder what the customer should hear next."
    },
    {
      "id": "mms_attachment_intake",
      "name": "Customer photo attachment intake",
      "status": "beta",
      "owner": "Pilot operations",
      "proof": "Authenticated Twilio media metadata is persisted before acknowledgment; the worker retrieves into quarantine with MIME, size, hash, provenance, lease, and scanner evidence.",
      "constraints": [
        "Attachments stay quarantined unless a real malware-scanner adapter marks them clean.",
        "Attachment content never becomes a customer-facing fact or claim automatically.",
        "Photo interpretation is not included in the pilot promise."
      ],
      "approvedPublicCopy": "Customer photo attachments can be retained for builder review in controlled pilot testing; Maya does not infer project facts from them."
    },
    {
      "id": "practice_mode",
      "name": "Practice Mode onboarding",
      "status": "manual_pilot",
      "owner": "Pilot operations",
      "proof": "Pilot setup includes review of business facts, policies, example conversations, and explicit activation.",
      "constraints": [
        "Customer messaging remains off until activation.",
        "Trial timing begins when the tenant is activated, not while setup is paused."
      ],
      "approvedPublicCopy": "Before customer messaging is activated, the builder reviews the business facts, voice, boundaries, and a practice conversation."
    },
    {
      "id": "automatic_pricing",
      "name": "Automatic pricing engine",
      "status": "planned",
      "owner": "Product",
      "proof": "Not part of the pilot release gate.",
      "constraints": ["No generated price may be presented as a current capability."],
      "approvedPublicCopy": "Automatic pricing is not included in the current pilot."
    },
    {
      "id": "calendar_integration",
      "name": "Direct calendar integration",
      "status": "planned",
      "owner": "Product",
      "proof": "Not part of the pilot release gate.",
      "constraints": ["No calendar availability may be inferred or claimed."],
      "approvedPublicCopy": "Direct calendar booking is not included in the current pilot."
    },
    {
      "id": "proposal_contract_automation",
      "name": "Proposal and contract automation",
      "status": "planned",
      "owner": "Product",
      "proof": "Not part of the pilot release gate.",
      "constraints": ["Acknowledgment must never be described as a signature."],
      "approvedPublicCopy": "Proposal, contract, and signature automation are not included in the current pilot."
    },
    {
      "id": "additional_channels",
      "name": "Voice, email, and web channels",
      "status": "planned",
      "owner": "Product",
      "proof": "The current pilot is SMS-first.",
      "constraints": ["Public product claims must describe SMS only."],
      "approvedPublicCopy": "The current pilot is focused on SMS."
    },
    {
      "id": "autonomous_nurture_reporting",
      "name": "Autonomous nurture and reporting",
      "status": "planned",
      "owner": "Product",
      "proof": "Not part of the pilot release gate.",
      "constraints": ["No automatic follow-up cadence or report may be promised."],
      "approvedPublicCopy": "Automated nurture, pipeline reporting, and autonomous decision-making are not included in the current pilot."
    }
  ]
}
