{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://tilfang.com/schema/v0.1.json",
  "title": "Tilfang Capability Declaration",
  "description": "A capability declaration states what a resource can do, where, how soon, and who must consent — precisely enough to be found, compared and booked. Concept artefact: this describes a design, not a running system; nothing has been onboarded against it, and every example below honestly declares status \"described\".",
  "type": "object",
  "properties": {
    "$schema": {
      "description": "Optional: point this at the published schema URL for editor IntelliSense and self-identification.",
      "type": "string"
    },
    "capabilityClass": {
      "description": "Which of the seven capability classes the resource answers. The class set is closed in v0.1 — the extensibility note carries that argument.",
      "enum": [
        "observe",
        "measure",
        "track",
        "inspect",
        "retrieve",
        "analyse",
        "report"
      ]
    },
    "resourceClass": {
      "description": "What kind of thing provides the capability — a class of resource, never a make, model or company name (write “drone-mounted thermal camera”, not a product name). The specific unit binds at booking, not here.",
      "type": "string",
      "minLength": 1
    },
    "reach": {
      "description": "Coverage geometry: which part of a target it can actually get to. Reach is why two resources answering the same capability are not interchangeable.",
      "type": "string",
      "minLength": 1
    },
    "leadTime": {
      "description": "How soon it can deliver once booked — from “immediate” (an archive) to “weeks, by availability” (a certified inspector). A mission with a season boundary selects on this before anything else.",
      "type": "string",
      "minLength": 1
    },
    "approval": {
      "description": "Consents, clearances and standing authorisations, roughly in the order obtained. An element may name a compound consent granted as one unit; a conditional clearance states its condition. Declaring this up front is what lets a plan carry its permissions instead of discovering them mid-mission.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "minItems": 1
    },
    "status": {
      "description": "Where the resource stands on the onboarding path. Defaults to “described” — which is also the honest value of every example on this site: nothing is cleared.",
      "enum": [
        "described",
        "constrained",
        "sandboxed",
        "cleared",
        "monitored",
        "revoked"
      ],
      "default": "described"
    },
    "conditions": {
      "description": "Operating constraints the declaration owns up to — weather windows, daylight, co-registration, staffing. A constraint declared here is one a mission plan can check instead of trip over.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      }
    },
    "extensions": {
      "description": "Per-domain attributes under a lowercase namespace key, carrying your real measured values, with units. Domain measures never enter the required core.",
      "type": "object",
      "patternProperties": {
        "^[a-z][a-z0-9-]*$": {
          "type": "object"
        }
      },
      "additionalProperties": false
    },
    "declaredBy": {
      "description": "Who is declaring — operator name, contact, date. Optional because the comparison works anonymously; named, the declaration becomes yours to send, and to be credited for.",
      "type": "object",
      "properties": {
        "operator": {
          "type": "string",
          "minLength": 1
        },
        "contact": {
          "type": "string"
        },
        "date": {
          "type": "string"
        }
      },
      "additionalProperties": false
    }
  },
  "required": [
    "capabilityClass",
    "resourceClass",
    "reach",
    "leadTime",
    "approval"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "capabilityClass": "inspect",
      "resourceClass": "Drone + thermal camera",
      "reach": "Roof and façade, close range",
      "leadTime": "Hours, weather permitting",
      "approval": [
        "Aviation authority",
        "Site owner"
      ],
      "status": "described",
      "conditions": [
        "Daylight or a stated thermal window",
        "Wind below the platform’s operating limit"
      ],
      "extensions": {
        "sensing": {
          "resolution": "Thermal ground resolution at survey distance",
          "threshold": "Declared against the mission’s stated defect size"
        }
      }
    },
    {
      "capabilityClass": "retrieve",
      "resourceClass": "Satellite imagery archive",
      "reach": "Only past acquisitions",
      "leadTime": "Immediate",
      "approval": [
        "Licence terms"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "analyse",
      "resourceClass": "Change-detection model",
      "reach": "Comparable image pairs",
      "leadTime": "Minutes",
      "approval": [
        "Model licence"
      ],
      "status": "described",
      "conditions": [
        "Input imagery co-registered"
      ]
    },
    {
      "capabilityClass": "observe",
      "resourceClass": "Satellite payload",
      "reach": "Wide area, top-down only",
      "leadTime": "Next usable overpass",
      "approval": [
        "Tasking contract"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "observe",
      "resourceClass": "Drone-mounted camera",
      "reach": "Any face, close range",
      "leadTime": "Hours, weather permitting",
      "approval": [
        "Aviation authority + site owner"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "observe",
      "resourceClass": "Fixed camera",
      "reach": "One fixed field of view",
      "leadTime": "Continuous",
      "approval": [
        "Site owner"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "observe",
      "resourceClass": "Shipborne radar",
      "reach": "Sea surface within range",
      "leadTime": "While the vessel is underway",
      "approval": [
        "Vessel operator"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "observe",
      "resourceClass": "Commercial observation service",
      "reach": "Whatever the contract covers",
      "leadTime": "Days, per service level",
      "approval": [
        "Contract only"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "observe",
      "resourceClass": "Human operator",
      "reach": "Wherever a person can go",
      "leadTime": "Scheduling and travel",
      "approval": [
        "Access permit + duty of care"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "measure",
      "resourceClass": "Environmental sensor network",
      "reach": "Fixed points, not between them",
      "leadTime": "Live",
      "approval": [
        "Network owner"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "measure",
      "resourceClass": "Laboratory instrument",
      "reach": "Only samples brought to it",
      "leadTime": "Days, including transport",
      "approval": [
        "Lab intake procedure"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "measure",
      "resourceClass": "Weather station",
      "reach": "One location, standard variables",
      "leadTime": "Live",
      "approval": [
        "Public or operator feed"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "measure",
      "resourceClass": "Multispectral payload",
      "reach": "The area under its path",
      "leadTime": "Per flight or overpass",
      "approval": [
        "Flight authorisation"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "measure",
      "resourceClass": "Industrial telemetry",
      "reach": "Instrumented plant only",
      "leadTime": "Live",
      "approval": [
        "Plant owner + safety case"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "track",
      "resourceClass": "Radar installation",
      "reach": "Within line of sight",
      "leadTime": "Live",
      "approval": [
        "Installation operator"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "track",
      "resourceClass": "AIS data feed",
      "reach": "Cooperating vessels only",
      "leadTime": "Near real time",
      "approval": [
        "Feed subscription"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "track",
      "resourceClass": "Fleet telematics feed",
      "reach": "One operator’s own fleet",
      "leadTime": "Live",
      "approval": [
        "Fleet owner + staff representation"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "track",
      "resourceClass": "Sensor fusion service",
      "reach": "As wide as its inputs",
      "leadTime": "Follows its slowest input",
      "approval": [
        "Rights to every input feed"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "inspect",
      "resourceClass": "Inspection robot",
      "reach": "Confined spaces, prepared route",
      "leadTime": "Days, needs mobilisation",
      "approval": [
        "Site owner + safety permit"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "inspect",
      "resourceClass": "Fixed monitoring camera",
      "reach": "One fixed field of view",
      "leadTime": "Continuous",
      "approval": [
        "Site owner"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "inspect",
      "resourceClass": "Certified human inspector",
      "reach": "Anywhere reachable on foot",
      "leadTime": "Weeks, by availability",
      "approval": [
        "Access permit + certification scope"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "retrieve",
      "resourceClass": "Telemetry historian",
      "reach": "Only what was recorded",
      "leadTime": "Immediate",
      "approval": [
        "Data owner"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "retrieve",
      "resourceClass": "Weather archive",
      "reach": "Station and model history",
      "leadTime": "Immediate",
      "approval": [
        "Open or licensed"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "retrieve",
      "resourceClass": "Asset & maintenance knowledge base",
      "reach": "One organisation’s assets",
      "leadTime": "Immediate",
      "approval": [
        "Internal access rights"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "retrieve",
      "resourceClass": "Public data service",
      "reach": "Published datasets only",
      "leadTime": "Immediate",
      "approval": [
        "Open licence"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "analyse",
      "resourceClass": "Photogrammetry API",
      "reach": "Overlapping imagery sets",
      "leadTime": "Hours per dataset",
      "approval": [
        "Service terms"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "analyse",
      "resourceClass": "Anomaly-detection service",
      "reach": "Signal types it was fitted to",
      "leadTime": "Minutes",
      "approval": [
        "Service terms"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "analyse",
      "resourceClass": "Domain analyst",
      "reach": "Any evidence a person can read",
      "leadTime": "Days, by availability",
      "approval": [
        "Engagement + confidentiality"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "report",
      "resourceClass": "Report generator",
      "reach": "Only what the plan captured",
      "leadTime": "Minutes",
      "approval": [
        "None beyond the mission"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "report",
      "resourceClass": "Evidence store",
      "reach": "Artefacts and their hashes",
      "leadTime": "On write",
      "approval": [
        "Retention policy"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "report",
      "resourceClass": "Audit-trail service",
      "reach": "Actions taken, not findings",
      "leadTime": "On write",
      "approval": [
        "Retention policy"
      ],
      "status": "described"
    },
    {
      "capabilityClass": "report",
      "resourceClass": "Human reviewer",
      "reach": "Judgement the others cannot give",
      "leadTime": "Days, by availability",
      "approval": [
        "Named signing authority"
      ],
      "status": "described"
    }
  ],
  "x-version": "0.1.0",
  "x-published": "2026-08-13",
  "x-status": "draft-for-argument",
  "x-capability-classes": [
    {
      "id": "observe",
      "name": "Observe",
      "description": "Acquire imagery or signals of a target or area."
    },
    {
      "id": "measure",
      "name": "Measure",
      "description": "Quantify a physical property to a defined quality."
    },
    {
      "id": "track",
      "name": "Track",
      "description": "Follow an object or signal across time and space."
    },
    {
      "id": "inspect",
      "name": "Inspect",
      "description": "Examine an asset for condition, defects, or anomalies."
    },
    {
      "id": "retrieve",
      "name": "Retrieve",
      "description": "Access existing records, archives, or reference data."
    },
    {
      "id": "analyse",
      "name": "Analyse",
      "description": "Turn raw data into validated findings."
    },
    {
      "id": "report",
      "name": "Report",
      "description": "Produce a verifiable, provenance-rich output."
    }
  ],
  "x-exclusions": {
    "cost": "Writing the worked examples showed cost is not a property of the resource at all: the same drone costs differently on a scheduled sweep and a call-out. Cost attaches to a booking — the (resource, mission, window) triple — so a price never appears in a capability declaration, and at concept stage a price would be a guess wearing a decimal point anyway."
  },
  "x-changelog": [
    {
      "version": "0.1.0",
      "date": "2026-08-13",
      "note": "Initial publication: seven classes, five required fields (class, resource class, reach, lead time, approval), lifecycle states mirroring the onboarding gates, namespaced domain extensions, cost excluded as a booking attribute. Published as a validatable JSON Schema with the site’s full resource catalogue embedded as conformant examples."
    }
  ],
  "x-pressure-points": [
    "A structured lead time — free text cannot be machine-compared, and the comparison claim leans on this field hardest.",
    "Jurisdiction and operating territory — reach today is geometry, not law, and a drone operator’s reality is both.",
    "Whether approval needs typed entries — a standing credential, a per-mission consent and a conditional clearance are different things an array of strings flattens."
  ],
  "x-feedback": "hello@tilfang.com",
  "x-human-readable": "https://tilfang.com/schema"
}
