{
  "format": "vercy-model-allocation-candidate/v1",
  "contourId": "EM-WRK-05",
  "proposedName": "Resource Pool",
  "modelId": null,
  "registryId": null,
  "allocationState": "unassigned",
  "decision": "NEW MODEL",
  "canonicalPublishable": false,
  "candidateRevision": 2,
  "identityTest": {
    "stableIdentity": "A governed reusable grouping of supply remains identifiable through membership turnover and planning releases.",
    "versionIdentity": "Kind, unit, calendar, membership rules, capacity, divisibility, exclusivity, reservation or overbooking changes create an immutable PoolVersion.",
    "independentLifecycle": [
      "draft",
      "approved",
      "active",
      "constrained",
      "suspended",
      "retired"
    ],
    "mastership": "resource-supply or capacity authority"
  },
  "boundary": {
    "owns": [
      "resource-pool root identity",
      "immutable pool versions",
      "effective memberships",
      "capacity assertions",
      "reservation and overbooking policy"
    ],
    "references": [
      {
        "target": "WM-ORG-016",
        "purpose": "optional context only; membership is never derived from or constrained by assignment or employment state"
      },
      {
        "target": "WM-PER-001",
        "purpose": "person member identity"
      },
      {
        "target": "WM-OBJ-001",
        "purpose": "physical member identity"
      },
      {
        "target": "WM-XCT-009",
        "purpose": "calendar and timezone"
      },
      {
        "target": "WM-ACT-008",
        "purpose": "capacity plan"
      },
      {
        "target": "WM-ECO-012",
        "purpose": "external valuation and budget only"
      },
      {
        "target": "WM-FLW-015",
        "purpose": "actual consumption only"
      }
    ],
    "excludes": [
      "person, employment, assignment or asset mastership",
      "demand or scenario identity",
      "actual consumption",
      "currency as capacity"
    ]
  },
  "objects": {
    "ResourcePool": {
      "identity": [
        "resourcePoolId"
      ],
      "required": [
        "name",
        "ownerRef",
        "status"
      ],
      "status": [
        "draft",
        "approved",
        "active",
        "constrained",
        "suspended",
        "retired"
      ]
    },
    "PoolVersion": {
      "identity": [
        "resourcePoolId",
        "version"
      ],
      "required": [
        "resourceKind",
        "quantityKind",
        "unit",
        "unitSchemeVersion",
        "calendarRef",
        "ianaZone",
        "tzdbRelease",
        "membershipRules",
        "capacityAssertions",
        "divisibility",
        "exclusivity",
        "reservationPolicy",
        "overbookingPolicy",
        "validFrom",
        "contentDigest"
      ],
      "optional": [
        "memberships",
        "memberOverrides",
        "validTo",
        "supersedesVersion"
      ],
      "digestCoverage": "all versioned fields"
    },
    "Membership": {
      "identity": [
        "resourcePoolId",
        "version",
        "memberKey"
      ],
      "required": [
        "memberRef",
        "memberType",
        "memberKey",
        "effectiveFrom",
        "divisibility",
        "exclusivity"
      ],
      "optional": [
        "effectiveTo"
      ],
      "memberType": [
        "WM-PER-001",
        "WM-OBJ-001"
      ]
    },
    "CapacityAssertion": {
      "required": [
        "quantityKind",
        "unit",
        "unitSchemeVersion",
        "quantityCharacter",
        "interval",
        "calendarRef",
        "valueState"
      ],
      "optional": [
        "amount",
        "evidenceRef"
      ],
      "valueState": [
        "asserted",
        "unknown"
      ],
      "constraints": [
        "amount and evidenceRef required iff asserted",
        "unknown contributes zero to available"
      ]
    },
    "OverbookingPolicy": {
      "required": [
        "allowance",
        "unit"
      ],
      "rule": "allowance zero means none; absence invalid"
    },
    "ReservationPolicy": {
      "required": [
        "defaultExpiry",
        "expiryClock",
        "calendarBasis"
      ]
    },
    "TimeInterval": {
      "required": [
        "start",
        "end",
        "ianaZone",
        "offset",
        "tzdbRelease",
        "calendarRef",
        "durationKind",
        "dstPolicy"
      ],
      "durationKind": [
        "elapsed",
        "working",
        "effort"
      ]
    }
  },
  "formulae": {
    "effectiveAvailable": "nominal - calendarUnavailable - committedElsewhere",
    "committedElsewhere": "excludes every scenario of the plan under evaluation",
    "threshold": "effectiveAvailable + absolute overbookingAllowance"
  },
  "invariants": [
    "Pool identity survives membership turnover; all semantic and capacity changes are versioned.",
    "Demand resourceClass and pool resourceKind use one named vocabulary; matching requires equal quantityKind and compatible unit under one unitSchemeVersion.",
    "Membership is never derived from employment, assignment or asset mastership.",
    "Membership validity covers every member allocation interval.",
    "Consolidation scope is one scenario release, one memberKey, one quantityKind and one interval.",
    "Member capacity is counted once in that consolidation scope.",
    "Suspended and retired roots yield zero available, never unknown; retired versions are historical-read only.",
    "No allocation references a PoolVersion outside its validity window.",
    "Unknown capacity contributes zero to available.",
    "Overbooking allowance is absolute in the pool unit and never inferred.",
    "No quantity is both netted from availability and counted as scenario load.",
    "Exclusivity is never overridable by overbooking and applies to every indivisible member interval.",
    "Currency is never a capacity quantity kind.",
    "Declared offset agrees with zone at the instant under pinned tzdbRelease.",
    "Pool writes to no external master."
  ],
  "holds": [
    "Registry allocation is pending and no identifier may be guessed.",
    "Base publication and relation-contract holds remain."
  ]
}
