{
  "id": "ferry",
  "name": "Ferry",
  "version": "0.0.0",
  "maturity": "prototype-contract",
  "category": "sales",
  "spine": {
    "id": "sales",
    "record": "deal over a contact and company graph"
  },
  "replaces": [
    {
      "name": "HubSpot CRM",
      "edition": null
    },
    {
      "name": "Pipedrive",
      "edition": null
    }
  ],
  "description": "An intervention-first sales pipeline for one business that turns credible deal-risk evidence into a human-controlled next move and a durable buyer commitment.",
  "scope": "One business, one configurable pipeline, equal operators; ownership routes work but does not restrict access.",
  "capabilities": [
    {
      "id": "owner-identity",
      "clauses": [
        "HOME-001"
      ]
    },
    {
      "id": "team",
      "clauses": [
        "TEAM-001",
        "TEAM-002",
        "TEAM-003"
      ]
    },
    {
      "id": "pipeline",
      "clauses": [
        "PIPE-001",
        "PIPE-002",
        "PIPE-003",
        "PIPE-004",
        "PIPE-005",
        "PIPE-006",
        "PIPE-007",
        "PIPE-008",
        "PIPE-009",
        "PIPE-010",
        "PIPE-011",
        "PIPE-012"
      ]
    },
    {
      "id": "relationships",
      "clauses": [
        "REL-001",
        "REL-002",
        "REL-003",
        "REL-004",
        "REL-005"
      ]
    },
    {
      "id": "activities",
      "clauses": [
        "ACT-001",
        "ACT-002",
        "ACT-003",
        "ACT-004"
      ]
    },
    {
      "id": "customer-commitments",
      "clauses": [
        "COMMIT-001",
        "COMMIT-002",
        "COMMIT-003",
        "COMMIT-004"
      ]
    },
    {
      "id": "deal-story",
      "clauses": [
        "EVID-001",
        "EVID-002",
        "STORY-001",
        "STORY-002"
      ]
    },
    {
      "id": "intervention-focus",
      "clauses": [
        "INT-001",
        "INT-002",
        "INT-003",
        "INT-004",
        "INT-005",
        "INT-006",
        "INT-007",
        "INT-008",
        "INT-009",
        "INT-010",
        "INT-011",
        "INT-012",
        "INT-013"
      ]
    },
    {
      "id": "outbound-follow-up",
      "clauses": [
        "MAIL-001",
        "MAIL-002",
        "MAIL-003",
        "MAIL-004"
      ]
    },
    {
      "id": "search-and-import",
      "clauses": [
        "SEARCH-001",
        "IMPORT-001",
        "IMPORT-002",
        "IMPORT-003"
      ]
    },
    {
      "id": "insights",
      "clauses": [
        "INSIGHT-001",
        "INSIGHT-002",
        "INSIGHT-003"
      ]
    },
    {
      "id": "records-and-data",
      "clauses": [
        "FIELD-001",
        "EXPORT-001"
      ]
    }
  ],
  "nonGoals": [
    "multiple workspaces or pipelines",
    "role, territory, or record-visibility hierarchies",
    "a separate lead object",
    "product catalogs, quotes, invoices, and contracts",
    "marketing campaigns and sequences",
    "autonomous outbound actions",
    "AI scoring or general AI chat",
    "retrieved exchange rates or currency conversion beyond operator-recorded rates",
    "per-operator time zones and locales",
    "inbound mailbox, Gmail, Outlook, or calendar synchronization",
    "recurring activities",
    "public forms, widgets, and booking pages",
    "file attachments",
    "SMS and calling",
    "arbitrary report builders, custom dashboards, goals, and team forecasting",
    "public APIs and webhooks",
    "native mobile apps",
    "post-sale project or customer-success management"
  ],
  "externals": [
    {
      "id": "transactional-mail",
      "required": true,
      "why": "SendGrid delivers native sign-in links through the optional Base transport. Confirmed deal-follow-up dispatch remains an unimplemented contract target.",
      "data": [
        "recipient email address",
        "message subject and body",
        "delivery identifiers"
      ],
      "adapters": [
        "mail.sender.v1"
      ]
    }
  ],
  "env": [
    {
      "name": "AUTH_SESSION_SECRET",
      "required": true,
      "secret": true,
      "why": "Signs and verifies operator sessions."
    },
    {
      "name": "FERRY_LOCAL_DEMO",
      "required": false,
      "secret": false,
      "why": "Enables the local-only demo session and seed route; the production deployment audit rejects it."
    },
    {
      "name": "APP_URL",
      "secret": false,
      "why": "Canonical HTTPS origin for native sign-in and request host validation.",
      "required": true
    },
    {
      "name": "EMAIL_FROM",
      "secret": false,
      "why": "Verified SendGrid sender for native sign-in mail.",
      "required": true
    },
    {
      "name": "SENDGRID_API_KEY",
      "secret": true,
      "why": "Deliver native sign-in links through the selected Base SendGrid transport.",
      "required": true
    },
    {
      "name": "FERRY_LOCAL_AUTH",
      "required": false,
      "secret": false,
      "why": "Enables native access to an explicitly bootstrapped empty loopback workspace; rejected by production deployment audit."
    }
  ],
  "deploy": {
    "healthPath": "/health",
    "operatorPath": "/app",
    "publicPaths": [
      "/",
      "/assets/",
      "/signin",
      "/auth/verify",
      "/auth/local-signin",
      "/__ferry/local-seed",
      "/health",
      "/auth/magic-link",
      "/auth/signout"
    ]
  },
  "customFields": [
    "deal",
    "person",
    "organization",
    "activity"
  ],
  "extensionPoints": {
    "contributions": [
      "app.route.v1",
      "app.navigation.v1",
      "app.settings-section.v1",
      "app.job.v1",
      "app.cron.v1",
      "app.queue-consumer.v1"
    ],
    "policies": [
      "operator.management.v1",
      "pipeline.stages.v1",
      "deal.stage-transition.v1",
      "deal.close-reason.v1",
      "relationship.required-roles.v1",
      "activity.reminder.v1",
      "deal.health-assessment.v1",
      "intervention.ranking.v1",
      "intervention.recommendation.v1"
    ],
    "events": [
      "deal.created.v1",
      "deal.stage-changed.v1",
      "deal.closed.v1",
      "deal.reopened.v1",
      "activity.completed.v1",
      "commitment.recorded.v1",
      "commitment.overdue.v1",
      "deal.health-assessed.v1",
      "intervention.deferred.v1",
      "deal.not-actionable.v1",
      "message.accepted.v1",
      "message.failed.v1"
    ],
    "slots": [
      "app.navigation.after.v1",
      "focus.header.after.v1",
      "focus.brief.actions.after.v1",
      "pipeline.toolbar.after.v1",
      "pipeline.deal-card.actions.after.v1",
      "deal-story.sidebar.after.v1",
      "deal-story.timeline.after.v1",
      "activity.detail.after.v1",
      "contact.detail.after.v1",
      "insights.intervention.after.v1",
      "settings.sections.after.v1"
    ],
    "adapters": [
      "auth.session.v1",
      "mail.sender.v1"
    ]
  },
  "limits": {
    "status": "estimate-untested",
    "operators": 25,
    "pipelineStages": 20,
    "activeDeals": 10000,
    "organizations": 10000,
    "people": 50000,
    "activities": 250000,
    "commitments": 100000,
    "csvRowsPerImport": 50000,
    "outboundMessagesPerDay": 500,
    "publicRateLimits": {
      "authInitiationsPerIpPerHour": 5,
      "authVerificationsPerIpPerHour": 10,
      "healthRequestsPerIpPerMinute": 60,
      "assetRequestsPerIpPerMinute": 600
    }
  },
  "accessibility": {
    "level": "WCAG 2.2 AA",
    "status": "target-unverified"
  },
  "operatingCost": {
    "currency": "USD",
    "status": "estimate-pending-load-test",
    "assumptions": "Cloudflare defaults to $0 on Workers Free for small use; external transactional mail and a domain are excluded. At the declared 10,000 active-deal limit, 15-minute INT-013 assessments create at least 960,000 D1 health-assessment row writes per day before indexes and other writes, above D1 Free's 100,000 rows-written-per-day limit. About 1,041 open deals is the theoretical Free write ceiling before indexes and other writes. Queues Free includes 10,000 operations per day; the declared 500 outbound messages per day use about 1,500 normal write/read/delete operations before retries.",
    "monthlyEstimate": "$0 on Workers Free for small use; D1 requires Workers Paid at the stated 15-minute assessment threshold. Estimate pending load test.",
    "includes": [
      "Workers Free baseline for small use",
      "D1 and Queues free tiers",
      "Cron and SQLite-backed Durable Objects including alarms"
    ],
    "excludes": [
      "external transactional mail",
      "domain registration",
      "custom AI providers",
      "inbound mailbox sync",
      "calendar sync"
    ]
  },
  "composition": {
    "base": "base",
    "family": "sales",
    "edition": "ferry",
    "modules": [
      "sendgrid-email"
    ]
  }
}
