{
  "$schema": "https://t2k.ai/schemas/t2k-ontology-pack.v1.schema.json",
  "manifestType": "t2k.ontology-pack",
  "manifestVersion": "1.0",
  "ontologyVersion": "1.0.0",
  "ontologyId": "example.business-operations",
  "label": "Business operations: delivery readiness",
  "description": "Separate operational readiness, team capacity, and dispatch review state.",
  "packKind": "workflow",
  "status": "draft",
  "scope": {
    "domain": "service_delivery",
    "description": "Fictional, read-only teaching example. Declared rules document intended semantics; they are not executable policy enforcement."
  },
  "objectTypes": [
    {
      "id": "service_job",
      "label": "Service job",
      "family": "Business operations",
      "nodeKind": "operating-entity",
      "purpose": "A customer job with recorded readiness and a required skill and effort.",
      "identity": [
        "job_id"
      ],
      "properties": [
        {
          "id": "job_id",
          "valueType": "string",
          "required": true,
          "description": "Stable identifier in this example source system.",
          "authorityDomain": "example_source",
          "temporal": false
        },
        {
          "id": "ready",
          "valueType": "boolean",
          "required": true,
          "description": "Operations has recorded that the job is ready for scheduling.",
          "authorityDomain": "example_source",
          "temporal": true
        },
        {
          "id": "materials_ready",
          "valueType": "boolean",
          "required": true,
          "description": "The materials check for this job is recorded complete.",
          "authorityDomain": "example_source",
          "temporal": true
        },
        {
          "id": "required_hours",
          "valueType": "number",
          "required": true,
          "description": "Estimated team hours for this job, not elapsed clock time.",
          "authorityDomain": "example_source",
          "temporal": true
        },
        {
          "id": "required_skill",
          "valueType": "string",
          "required": true,
          "description": "One skill key used by this narrow example.",
          "authorityDomain": "example_source",
          "temporal": true
        }
      ]
    },
    {
      "id": "team",
      "label": "Delivery team",
      "family": "Business operations",
      "nodeKind": "organization",
      "purpose": "A team with remaining capacity and recorded skills for this snapshot.",
      "identity": [
        "team_id"
      ],
      "properties": [
        {
          "id": "team_id",
          "valueType": "string",
          "required": true,
          "description": "Stable identifier in this example source system.",
          "authorityDomain": "example_source",
          "temporal": false
        },
        {
          "id": "available",
          "valueType": "boolean",
          "required": true,
          "description": "Recorded availability in the current planning window.",
          "authorityDomain": "example_source",
          "temporal": true
        },
        {
          "id": "capacity_hours",
          "valueType": "number",
          "required": true,
          "description": "Remaining team hours in the same planning window as the job estimate.",
          "authorityDomain": "example_source",
          "temporal": true
        },
        {
          "id": "skills",
          "valueType": "string_list",
          "required": true,
          "description": "Recorded skill keys; not a certification or license registry.",
          "authorityDomain": "example_source",
          "temporal": true
        }
      ]
    },
    {
      "id": "site",
      "label": "Customer site",
      "family": "Business operations",
      "nodeKind": "operating-entity",
      "purpose": "A delivery location associated with a job.",
      "identity": [
        "site_id"
      ],
      "properties": [
        {
          "id": "site_id",
          "valueType": "string",
          "required": true,
          "description": "Stable identifier in this example source system.",
          "authorityDomain": "example_source",
          "temporal": false
        },
        {
          "id": "name",
          "valueType": "string",
          "required": true,
          "description": "Human-readable fictional customer site name.",
          "authorityDomain": "example_source",
          "temporal": false
        }
      ]
    },
    {
      "id": "service",
      "label": "Service offering",
      "family": "Business operations",
      "nodeKind": "reference",
      "purpose": "The service category requested by a job and offered by a team.",
      "identity": [
        "service_id"
      ],
      "properties": [
        {
          "id": "service_id",
          "valueType": "string",
          "required": true,
          "description": "Stable identifier in this example source system.",
          "authorityDomain": "example_source",
          "temporal": false
        },
        {
          "id": "name",
          "valueType": "string",
          "required": true,
          "description": "Name of the service offering.",
          "authorityDomain": "example_source",
          "temporal": false
        }
      ]
    },
    {
      "id": "dispatch_approval",
      "label": "Dispatch approval record",
      "family": "Business operations",
      "nodeKind": "authority",
      "purpose": "A recorded dispatch review state, separate from capacity and work completion.",
      "identity": [
        "approval_id"
      ],
      "properties": [
        {
          "id": "approval_id",
          "valueType": "string",
          "required": true,
          "description": "Stable identifier in this example source system.",
          "authorityDomain": "example_source",
          "temporal": false
        },
        {
          "id": "status",
          "valueType": "string",
          "required": true,
          "description": "Recorded state: pending, approved, or rejected. The query checks equality only.",
          "authorityDomain": "example_source",
          "temporal": true
        },
        {
          "id": "reviewer_role",
          "valueType": "string",
          "required": true,
          "description": "Role recorded by the review source; no authority registry is evaluated.",
          "authorityDomain": "example_source",
          "temporal": true
        }
      ]
    }
  ],
  "structuralRelationships": [
    {
      "from": "service_job",
      "property": "at_site",
      "to": "site",
      "cardinality": "many_to_one",
      "description": "The customer site where the job would be delivered."
    },
    {
      "from": "service_job",
      "property": "needs_service",
      "to": "service",
      "cardinality": "many_to_one",
      "description": "The service offering requested by the job."
    },
    {
      "from": "service_job",
      "property": "candidate_team",
      "to": "team",
      "cardinality": "many_to_many",
      "description": "Teams considered as options; this relationship does not assign or reserve a team."
    },
    {
      "from": "service_job",
      "property": "has_approval",
      "to": "dispatch_approval",
      "cardinality": "one_to_one",
      "description": "The current review record for this teaching job; it is not an execution credential."
    },
    {
      "from": "team",
      "property": "offers_service",
      "to": "service",
      "cardinality": "many_to_many",
      "description": "Service categories in the team catalog; the example capacity query uses the recorded skill key."
    }
  ],
  "reasoningFunctions": [
    {
      "id": "capacity_options",
      "input": "Accepted current job and candidate-team records.",
      "output": "Job/team options meeting recorded readiness, materials, skill, availability, and individual capacity checks.",
      "humanCheckpoint": "Review scheduling conflicts and approval separately. These options do not reserve shared capacity or authorize dispatch."
    },
    {
      "id": "pending_dispatch_reviews",
      "input": "Accepted current job records and linked approval states.",
      "output": "Ready jobs with materials recorded ready and a linked pending dispatch review.",
      "humanCheckpoint": "A reviewer confirms scope and authority in the operational system before acting."
    }
  ],
  "normalizationRules": [
    "Preserve job and team source IDs; do not merge teams by display name.",
    "Use team hours consistently for both required_hours and capacity_hours; do not silently convert elapsed time or headcount.",
    "Keep readiness, materials readiness, capacity, approval, and actual completion as distinct concepts.",
    "Candidate links do not allocate capacity. Two individually feasible jobs may compete for the same team hours."
  ],
  "validationRules": [
    {
      "id": "nonnegative_hours",
      "level": "semantic",
      "severity": "review",
      "target": "service_job.required_hours, team.capacity_hours",
      "assertion": "Declared import requirement: hour quantities are nonnegative and use the same planning window.",
      "message": "The teaching programs compare recorded numbers; a production importer must enforce units and nonnegative quantities."
    },
    {
      "id": "approval_is_separate",
      "level": "governance",
      "severity": "review",
      "target": "dispatch_approval",
      "assertion": "A recorded approved state does not establish the reviewer's authority or issue a dispatch action.",
      "message": "Validate authority, scope, expiry, and reservations before a real operational write."
    },
    {
      "id": "capacity_counterexample",
      "level": "behavioral",
      "severity": "review",
      "target": "capacity_options",
      "assertion": "Reducing Maple team capacity below Riverside job effort removes that option.",
      "message": "The scenario variant exercises this exact comparison; it is not an optimization or scheduling solver."
    }
  ],
  "extensions": {
    "exampleOnly": true,
    "ruleExecution": "Normalization and validation rules are declarative documentation; only the scenario graph-function programs execute."
  }
}
