{
  "format": "vercy-model-allocation-candidate/v1",
  "contourId": "EM-PEO-07",
  "proposedName": "Timesheet",
  "modelId": null,
  "registryId": null,
  "allocationState": "unassigned",
  "decision": "NEW MODEL",
  "canonicalPublishable": false,
  "identityTest": {
    "stableIdentity": "A period-scoped declaration of a fixed member set remains identifiable across submission, approval, rejection and later correction independently of its worklogs.",
    "versionIdentity": "Member-set or declaration corrections create linked successor revisions or adjustment entries; an approved revision is immutable.",
    "independentLifecycle": [
      "draft",
      "submitted",
      "returned",
      "approved",
      "rejected",
      "superseded",
      "adjusted",
      "closed"
    ],
    "mastership": "time-reporting and approval authority"
  },
  "boundary": {
    "owns": [
      "persistent timesheet identity",
      "person, engagement and reporting period",
      "immutable member-set digest",
      "submission declaration",
      "approval decision and scope",
      "authority and decision time",
      "return, rejection and adjustment history",
      "supersession and closure lineage"
    ],
    "references": [
      {
        "target": "WM-PER-001",
        "purpose": "Person anchor"
      },
      {
        "target": "WM-ORG-005",
        "purpose": "Engagement"
      },
      {
        "target": "WM-ORG-016",
        "purpose": "Assignment context"
      },
      {
        "target": "WM-XCT-009",
        "purpose": "Reporting period calendar"
      }
    ],
    "excludes": [
      "worklog identity or content mastership",
      "presence, performance or quality proof",
      "payroll calculation or payment",
      "employment or assignment identity",
      "absence or availability projection",
      "silent mutation of approved periods",
      "TimeApproval as an independent model root or externally mastered record"
    ]
  },
  "objects": {
    "Interval": {
      "identity": [],
      "required": [
        "startInstant",
        "endInstant",
        "startOffset",
        "endOffset",
        "tzid",
        "tzdbRelease",
        "durationKind"
      ],
      "optional": [
        "nominalDuration",
        "exactDuration"
      ],
      "enumerations": {
        "durationKind": [
          "exact",
          "nominal"
        ]
      }
    },
    "Timesheet": {
      "identity": [
        "timesheetId"
      ],
      "required": [
        "personRef",
        "engagementRef",
        "period"
      ],
      "optional": [
        "successorRef",
        "closedAt"
      ],
      "types": {
        "period": "Interval"
      },
      "derived": {
        "status": "latestRevision.revisionStatus"
      },
      "lifecycle": [
        "draft",
        "submitted",
        "returned",
        "approved",
        "rejected",
        "superseded",
        "adjusted",
        "closed"
      ]
    },
    "TimesheetRevision": {
      "identity": [
        "timesheetId",
        "revision"
      ],
      "required": [
        "memberWorklogRefs",
        "memberDigest",
        "declaration",
        "contentDigest",
        "revisionStatus"
      ],
      "optional": [
        "approvalSequences",
        "adjustmentRefs",
        "supersedesRevision"
      ],
      "enumerations": {
        "revisionStatus": [
          "draft",
          "submitted",
          "returned",
          "approved",
          "rejected",
          "superseded",
          "adjusted",
          "closed"
        ]
      }
    },
    "TimeApproval": {
      "identity": [
        "timesheetId",
        "approvalSequence"
      ],
      "required": [
        "scope",
        "authorityRef",
        "approverRef",
        "decision",
        "decidedAt",
        "memberDigest"
      ],
      "optional": [
        "priorApprovalSequence",
        "rationale"
      ],
      "enumerations": {
        "scope": [
          "entry",
          "day",
          "period"
        ],
        "decision": [
          "approved",
          "rejected",
          "returned"
        ]
      },
      "ownership": "Timesheet aggregate"
    }
  },
  "invariants": [
    "Every timesheet identifies one person, engagement and reporting period.",
    "Submission freezes an immutable member set and digest.",
    "Approval names scope, authority, decision and time.",
    "Approval attests review and never proves presence, productivity or quality.",
    "Approved revisions are immutable.",
    "Corrections create linked successor revisions or adjustment entries.",
    "Worklogs remain independently identified and externally mastered.",
    "Rejection and return remain distinct from withdrawal or correction.",
    "Time Approval is aggregate-owned and never an independent model root.",
    "Timesheet approval never creates payroll result or payment.",
    "Missing worklogs remain unknown and explicit zero remains a worklog assertion.",
    "Closed timesheets remain resolvable with all approvals and adjustments.",
    "An interval is rejected unless both bounds carry an explicit offset and the interval carries tzid and tzdbRelease.",
    "TimeApproval entries are append-only; an existing sequence is never overwritten, reordered or deleted.",
    "Where separation of duties applies, approverRef must not equal the timesheet personRef.",
    "Timesheet.status is derived from the latest revision and is never independently written."
  ],
  "holds": [
    "Registry allocation is pending and no identifier may be guessed.",
    "Payroll, labor-policy and approval-authority crosswalks require canonical review.",
    "Package conversion and live verification are pending.",
    "Independent Grok review and the single frozen audit are complete; 16 defects were remediated without rerun.",
    "Whether an issued-record model should carry externally attested approval evidence is an open question deferred to registry allocation; no such reference is asserted here."
  ]
}
