Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
9a0ca7e
feat(packaging): implement CandidateDocumentDisposition packet contract
seonghobae Sep 11, 2026
4c214b3
chore(talent): adopt candidate lifecycle ADR parent
seonghobae Sep 11, 2026
ae887b1
test(talent): expose disposition lifecycle invariant gaps
seonghobae Sep 11, 2026
16027ee
fix(talent): enforce disposition lifecycle integrity
seonghobae Sep 11, 2026
b5b1e61
test(talent): expose retained runtime aliases
seonghobae Sep 11, 2026
f42bfce
fix(talent): detach disposition runtime evidence
seonghobae Sep 11, 2026
f589d1e
test(talent): reject executable text subtypes in disposition evidence
seonghobae Sep 11, 2026
76f7b60
fix(talent): require inert built-in disposition text evidence
seonghobae Sep 11, 2026
d41523b
test(talent): reject executable nested timezone evidence
seonghobae Sep 11, 2026
15d6dca
fix(talent): reject executable nested timezone evidence
seonghobae Sep 11, 2026
1600812
test(talent): require return dispatch evidence before destruction
seonghobae Sep 11, 2026
70ef86a
fix(talent): bind return destruction to dispatch evidence
seonghobae Sep 11, 2026
61bf81a
test(talent): require return delivery evidence before destruction
seonghobae Sep 11, 2026
4c1322b
fix(talent): require return delivery receipt before destruction
seonghobae Sep 11, 2026
4512837
test(talent): align state fixtures with return evidence invariants
seonghobae Sep 11, 2026
b1a2d15
test(talent): preserve legal-hold regression with valid return evidence
seonghobae Sep 11, 2026
676afec
test(talent): require verified return-request receipt chain
seonghobae Sep 11, 2026
ec89443
fix(talent): bind return lifecycle to verified request receipt
seonghobae Sep 11, 2026
65fc448
test(talent): align packet fixtures with verified return chain
seonghobae Sep 11, 2026
a4b8051
test(talent): use bounded return-request reference contract
seonghobae Sep 11, 2026
252135a
fix(talent): shorten return-request reference namespace
seonghobae Sep 11, 2026
31cea07
test(talent): align return fixtures to bounded request namespace
seonghobae Sep 11, 2026
3b76763
test(talent): require claim-window and return-SLA evidence
seonghobae Sep 11, 2026
2e2c426
fix(talent): carry policy-computed return SLA evidence
seonghobae Sep 11, 2026
445b707
test(talent): reject future return-stage evidence
seonghobae Sep 11, 2026
bda89e0
fix(talent): bind return evidence to lifecycle state
seonghobae Sep 11, 2026
2ecff0b
test(talent): align legacy fixtures with return SLA evidence
seonghobae Sep 11, 2026
bc16dda
test(talent): carry claim-window evidence in state matrix
seonghobae Sep 11, 2026
887ab34
test(talent): bind suspended state to active legal hold
seonghobae Sep 11, 2026
2fd12e5
fix(talent): require active hold for suspended state
seonghobae Sep 11, 2026
3af6830
test(talent): align state matrix with legal-hold invariant
seonghobae Sep 11, 2026
0bb1154
test(talent): require statutory retention deadline evidence
seonghobae Sep 11, 2026
3c61995
fix(talent): bind statutory states to retention deadline
seonghobae Sep 11, 2026
b0add81
test(talent): align statutory-state fixture evidence
seonghobae Sep 11, 2026
d94b4e7
test(talent): reject future return evidence before request
seonghobae Sep 11, 2026
294394f
test(talent): reach legal-hold gate for statutory destruction
seonghobae Sep 11, 2026
fdda3d8
fix(talent): close pre-request return evidence envelope
seonghobae Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions packages/candidate-document-disposition/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[build-system]
requires = ["setuptools>=69"]
build-backend = "setuptools.build_meta"

[project]
name = "orgmetra-candidate-document-disposition"
version = "0.1.0"
description = "PII-minimized candidate-document disposition packet contracts for Orgmetra."
requires-python = ">=3.12"

[project.optional-dependencies]
test = ["pytest>=8.3", "pytest-cov>=5.0"]

[tool.setuptools.packages.find]
where = ["src"]

[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = [
"--cov=orgmetra_candidate_document_disposition",
"--cov-branch",
"--cov-report=term-missing",
"--cov-fail-under=100",
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from orgmetra_candidate_document_disposition.packet import (
CandidateDocumentDisposition,
build_candidate_document_disposition,
)

__all__ = [
"CandidateDocumentDisposition",
"build_candidate_document_disposition",
]

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from datetime import datetime, timezone

import pytest

from orgmetra_candidate_document_disposition import build_candidate_document_disposition


def _build(*, legal_hold: bool):
return build_candidate_document_disposition(
tenant_record_id="00000000-0000-4000-a000-000000000001",
disposition_reference="candidate_document_disposition:00000000-0000-4000-a000-000000000010",
document_reference="document:00000000-0000-4000-a000-000000000020",
candidate_reference="candidate_profile:00000000-0000-4000-a000-000000000030",
hiring_decision_finalized_at=datetime(2026, 9, 11, 12, 0, 0, tzinfo=timezone.utc),
return_eligibility="eligible",
state="legal_hold_suspended",
retention_policy_version="v2026_09",
retention_policy_digest="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
retention_anchor_event="hiring_decision_finalized",
retain_until=datetime(2027, 9, 11, 12, 0, 0, tzinfo=timezone.utc),
legal_hold=legal_hold,
purpose_code="candidate_document_disposition",
reason_code="legal_hold_release",
evidence_version=1,
actor_reference="actor:00000000-0000-4000-a000-000000000040",
)


def test_legal_hold_suspended_rejects_inactive_hold():
with pytest.raises(ValueError, match="legal_hold_suspended"):
_build(legal_hold=False)


def test_legal_hold_suspended_accepts_active_hold():
packet = _build(legal_hold=True)
assert packet.state == "legal_hold_suspended"
assert packet.legal_hold is True
Loading