# PageIdentity

**Kind:** Interface

**Source:** [`atloria-monorepo/apps/api/src/docs-repo/sidecar.ts`](https://github.com/sherkety/atloria/blob/main/atloria-monorepo/apps/api/src/docs-repo/sidecar.ts#L29)

The `.atloria/` identity sidecar — the stable-identity layer that makes ACCUMULATION
(delta generation instead of full sweeps) possible in S3/S4.

Two files, both written OUTSIDE docs/ so ReconcilerService.driftCheck (which compares only
docs/) never sees them as drift:

  • `.atloria/pages.json`      — a per-page manifest: for every served page, its stable
                                 docUuid, natural key (kgEntityId/type), contentHash +
                                 generatorFingerprint (the split-oracle inputs), source
                                 screen provenance, and the section map (toc ids+levels).
                                 A PURE PROJECTION of the current DB set (rebuilt each time).

  • `.atloria/slug-registry.json` — the ACCUMULATING identity ledger keyed by docUuid:
                                 current slug + the history of previous slugs. This is the
                                 one file that carries history the DB does not retain, so a
                                 rename is followed (same docUuid) rather than seen as a
                                 delete+add. It is read-merged, never rebuilt from scratch.

HARD INVARIANT — DETERMINISM. Both serializers are byte-stable for the same logical input:
keys are sorted, there are NO wall-clock timestamps, and section order (reading order) is
preserved while set-like arrays (screen slugs) are sorted+deduped. This is load-bearing:
the committer only writes a commit when `git status` is dirty, so a non-deterministic sidecar
would fabricate a commit on every reconcile and destroy the idempotent-no-op guarantee the
substrate depends on. Every change here is covered by an idempotency property test.

## Properties

| Property | Type |
|---|---|
| `path` | `string` |
| `docUuid` | `string` |
| `scope` | `string` |
| `lang` | `string` |
| `slug` | `string` |
| `registryLang` | `string` |
| `kgEntityId` | `string | null` |
| `kgEntityType` | `string | null` |
| `contentHash` | `string | null` |
| `generatorFingerprint` | `string | null` |
| `sourceScreenSlugs` | `string[]` |
| `sections` | `{ id: string; level: number }[]` |
