# Retention schedules, legal holds and backups

Separate retention time from deletion authority. Review trigger events, copies and holds using fixed-time synthetic records.

Original AI-assisted SecNet educational content. Fictional local examples; not a standards provider publication, endorsement or compliance evidence. Page exercises do not create account progress.

Sources checked: 2026-10-21

## What starts the retention period?

Harbor’s schedule records category, purpose, obligation assessment, trigger event and owner. Creation, contract end or another event may start a period; a day count alone is insufficient. Authorized legal, records and business owners determine actual requirements in context. This package calculates no universal KVKK/GDPR period and presents no example date as a legal obligation. Its retainUntil value is only a fictional review threshold. Confusing source-event dates with derivative-file dates can produce unintended retention. Keep the rationale and clock anchor beside the date, not in an unrelated spreadsheet.

## Holds and authorized decisions

A record may be needed for an investigation or legal preservation. Authorized teams define scope, authority and release procedures. In the local profile, legalHold true yields hold even after the date; this is a teaching rule only. The tool verifies no actual legal restriction or its validity. Compare two fictional records with the same date but different hold states. Expired means review is needed, not execute deletion. The tool deletes no files, backups or records and makes no determination about which legal duties take precedence in a real matter.

## Backups, archives and copies differ

Backups may support recovery while archives support records retention, with different behavior even inside one product. Primary deletion may not immediately remove snapshots, replicas or SaaS preservation copies. Record copy scope, access, timing and handling of older data after restoration. Microsoft Purview retention behavior is one product example, not universal storage semantics. Harbor asks who will validate each copy. This exercise changes no real retention or recovery policy and promises no instant removal from every system. A restore plan should account for prior authorized disposition decisions rather than silently reintroducing old records.

## Thresholds, evidence and review

The local desk compares asOf and retainUntil using valid UTC calendar times; equality means review is due. It never uses the computer’s current clock, keeping examples reproducible. Hold, review-due and not-due are independent from sharing decisions. A shareable document may need retention review, while a blocked share may still need preservation. An owner evaluates ongoing purpose, scope and exceptions. Actual disposition needs separate authority and validation; the local output is neither a compliance report nor a deletion instruction. It highlights questions rather than resolving real legal obligations.

## Working sequence

1. Record category, purpose and retention trigger.
2. Compare fictional dates at a fixed UTC instant.
3. Separate hold status from sharing decisions.
4. Review backups, replicas and restore handling.
5. Record authorized review and open work.

## 1. A day count exists

A day count explains neither purpose, basis nor trigger event. A schedule without ownership and an anchor is incomplete for actual retention decisions.

This code is a local policy model; it does not replace actual content discovery, DLP or sanitization validation.

### Weak implementation
```js
s => s.daysListed === true
```

### Corrected implementation
```js
s => s.daysListed === true &&
  s.purposeAndBasis === true &&
  s.anchorDefined === true &&
  s.ownerAssigned === true
```

### Synthetic input and actual model output
```json
{
  "before": [
    {
      "name": "documented-case",
      "input": {
        "daysListed": true,
        "purposeAndBasis": true,
        "anchorDefined": true,
        "ownerAssigned": true
      },
      "expected": true,
      "observed": true,
      "matched": true
    },
    {
      "name": "missing-purposeAndBasis",
      "input": {
        "daysListed": true,
        "purposeAndBasis": false,
        "anchorDefined": true,
        "ownerAssigned": true
      },
      "expected": false,
      "observed": true,
      "matched": false
    },
    {
      "name": "missing-anchorDefined",
      "input": {
        "daysListed": true,
        "purposeAndBasis": true,
        "anchorDefined": false,
        "ownerAssigned": true
      },
      "expected": false,
      "observed": true,
      "matched": false
    }
  ],
  "after": [
    {
      "name": "documented-case",
      "input": {
        "daysListed": true,
        "purposeAndBasis": true,
        "anchorDefined": true,
        "ownerAssigned": true
      },
      "expected": true,
      "observed": true,
      "matched": true
    },
    {
      "name": "missing-purposeAndBasis",
      "input": {
        "daysListed": true,
        "purposeAndBasis": false,
        "anchorDefined": true,
        "ownerAssigned": true
      },
      "expected": false,
      "observed": false,
      "matched": true
    },
    {
      "name": "missing-anchorDefined",
      "input": {
        "daysListed": true,
        "purposeAndBasis": true,
        "anchorDefined": false,
        "ownerAssigned": true
      },
      "expected": false,
      "observed": false,
      "matched": true
    }
  ]
}
```

## 2. Expired: delete it?

Passing a date grants no deletion authority. Review holds, scope and authorized ownership; the local model produces a review cue, not a real legal decision.

This code is a local policy model; it does not replace actual content discovery, DLP or sanitization validation.

### Weak implementation
```js
s => s.periodExpired === true
```

### Corrected implementation
```js
s => s.periodExpired === true &&
  s.holdReviewed === true &&
  s.authorityAssigned === true &&
  s.scopeMapped === true
```

### Synthetic input and actual model output
```json
{
  "before": [
    {
      "name": "documented-case",
      "input": {
        "periodExpired": true,
        "holdReviewed": true,
        "authorityAssigned": true,
        "scopeMapped": true
      },
      "expected": true,
      "observed": true,
      "matched": true
    },
    {
      "name": "missing-holdReviewed",
      "input": {
        "periodExpired": true,
        "holdReviewed": false,
        "authorityAssigned": true,
        "scopeMapped": true
      },
      "expected": false,
      "observed": true,
      "matched": false
    },
    {
      "name": "missing-scopeMapped",
      "input": {
        "periodExpired": true,
        "holdReviewed": true,
        "authorityAssigned": true,
        "scopeMapped": false
      },
      "expected": false,
      "observed": true,
      "matched": false
    }
  ],
  "after": [
    {
      "name": "documented-case",
      "input": {
        "periodExpired": true,
        "holdReviewed": true,
        "authorityAssigned": true,
        "scopeMapped": true
      },
      "expected": true,
      "observed": true,
      "matched": true
    },
    {
      "name": "missing-holdReviewed",
      "input": {
        "periodExpired": true,
        "holdReviewed": false,
        "authorityAssigned": true,
        "scopeMapped": true
      },
      "expected": false,
      "observed": false,
      "matched": true
    },
    {
      "name": "missing-scopeMapped",
      "input": {
        "periodExpired": true,
        "holdReviewed": true,
        "authorityAssigned": true,
        "scopeMapped": false
      },
      "expected": false,
      "observed": false,
      "matched": true
    }
  ]
}
```

## 3. Primary file reviewed

Primary-record review does not complete backup and replica scope. Plan for reappearance after restoration and do not generalize one system’s result to every copy.

This code is a local policy model; it does not replace actual content discovery, DLP or sanitization validation.

### Weak implementation
```js
s => s.primaryReviewed === true
```

### Corrected implementation
```js
s => s.primaryReviewed === true &&
  s.backupScoped === true &&
  s.replicasMapped === true &&
  s.restoreHandling === true
```

### Synthetic input and actual model output
```json
{
  "before": [
    {
      "name": "documented-case",
      "input": {
        "primaryReviewed": true,
        "backupScoped": true,
        "replicasMapped": true,
        "restoreHandling": true
      },
      "expected": true,
      "observed": true,
      "matched": true
    },
    {
      "name": "missing-backupScoped",
      "input": {
        "primaryReviewed": true,
        "backupScoped": false,
        "replicasMapped": true,
        "restoreHandling": true
      },
      "expected": false,
      "observed": true,
      "matched": false
    },
    {
      "name": "missing-restoreHandling",
      "input": {
        "primaryReviewed": true,
        "backupScoped": true,
        "replicasMapped": true,
        "restoreHandling": false
      },
      "expected": false,
      "observed": true,
      "matched": false
    }
  ],
  "after": [
    {
      "name": "documented-case",
      "input": {
        "primaryReviewed": true,
        "backupScoped": true,
        "replicasMapped": true,
        "restoreHandling": true
      },
      "expected": true,
      "observed": true,
      "matched": true
    },
    {
      "name": "missing-backupScoped",
      "input": {
        "primaryReviewed": true,
        "backupScoped": false,
        "replicasMapped": true,
        "restoreHandling": true
      },
      "expected": false,
      "observed": false,
      "matched": true
    },
    {
      "name": "missing-restoreHandling",
      "input": {
        "primaryReviewed": true,
        "backupScoped": true,
        "replicasMapped": true,
        "restoreHandling": false
      },
      "expected": false,
      "observed": false,
      "matched": true
    }
  ]
}
```

## Exit evidence

- Schedule draft with purpose, basis, trigger and owner.
- Hold, copy-scope and outcome-review record.

## References

- [Microsoft Purview · Retention policies and labels](https://learn.microsoft.com/en-us/purview/retention)
- [NIST SP 800-209 · Storage infrastructure security · October 2020](https://csrc.nist.gov/pubs/sp/800/209/final)
- [European Commission · GDPR principles and storage limitation](https://commission.europa.eu/law/law-topic/data-protection/information-business-and-organisations/principles-gdpr_en)
