# Archive manifest // [consuming-project-name] / [archive-id]

Provenance record for a sealed interactive archive rendered from the design-system-ASK Class B `message-archive` pattern.

## Upstream design system

- Repo: https://github.com/apexSolarKiss/design-system-ASK
- Commit (full): `0000000000000000000000000000000000000000`
- Commit (short): `0000000`
- Commit date: `YYYY-MM-DDTHH:MM:SSZ`

## Files copied into local mirror

| File | Path in mirror | SHA-256 |
| --- | --- | --- |
| colors_and_type.css | `_dsa-tokens/colors_and_type.css` | `<sha256 here>` |
| InterVariable.woff2 | `_dsa-tokens/fonts/InterVariable.woff2` | `<sha256 here>` |
| InterVariable-Italic.woff2 | `_dsa-tokens/fonts/InterVariable-Italic.woff2` | `<sha256 here>` |
| JetBrainsMono.woff2 | `_dsa-tokens/fonts/JetBrainsMono.woff2` | `<sha256 here>` |
| JetBrainsMono-Italic.woff2 | `_dsa-tokens/fonts/JetBrainsMono-Italic.woff2` | `<sha256 here>` |

## Consuming project

- Project: `[consuming-project-name]`
- Artifact path (relative to project root): `[path/to/archive.html]`
- Template: `message-archive` (from `patterns/message-archive/` in upstream)

## Archive timeline

- Archive id: `[archive-id]`
- Title: `[archive title]`
- Source types: `[e.g. imessage, sms-rcs]`
- Span: `[start_at]` → `[end_at]`
- Message count: `[N]`

### Source channels merged into this timeline

| Channel id | Label | Source type | Notes |
| --- | --- | --- | --- |
| `[channel-1]` | `[label]` | `[source type]` | `[direct / group; participant set]` |
| `[channel-2]` | `[label]` | `[source type]` | `[folded in; carries data-channel per message]` |

Source threads are provenance inputs, not separate output files. The delivered object is the merged timeline.

## Pattern input

The exact template inherited, not merely the repository revision.

| File | Upstream path | SHA-256 |
| --- | --- | --- |
| message-archive.template.html | `patterns/message-archive/message-archive.template.html` | `<sha256 here>` |

## Renderer

- Renderer / tool: `[...]`
- Version or commit: `[...]`
- Rendering configuration: `[...]`
- Renderer source SHA-256, when not identified by an immutable commit: `[...]`

## Sealed artifact

- Artifact filename: `[...]`
- Artifact SHA-256: `[...]`
- Byte size: `[...]`

## Font sealing

The mechanical mode can be inspected in the delivered bytes — data-backed `@font-face` rules are either present or absent. What those bytes cannot establish is the **input-file provenance**, the recorded hashes, or whether a fidelity downgrade was **deliberate**. Declare all three.

- Font sealing mode: `embedded-data-uri` | `fallback-stacks`
- Canonical font files carried by artifact: `yes` | `no`
- Typography fidelity guaranteed by artifact: `yes` | `no`

**For `embedded-data-uri`:**

Input paths and hashes are owned once, by **Files copied into local mirror** above. Do not restate them here — one provenance record must not carry two editable copies of the same hash.

| Font file | Input hash source | Decoded `data:` payload hashes to the recorded input SHA-256 |
| --- | --- | --- |
| InterVariable.woff2 | *Files copied into local mirror*, row above | `yes` |
| InterVariable-Italic.woff2 | *Files copied into local mirror*, row above | `yes` |
| JetBrainsMono.woff2 | *Files copied into local mirror*, row above | `yes` |
| JetBrainsMono-Italic.woff2 | *Files copied into local mirror*, row above | `yes` |

Validation means **decode the embedded `data:` URI and hash its bytes**, then compare to the input SHA-256 in the canonical table. Confirming that a `data:` string merely exists is not validation.

**For `fallback-stacks`:**

- `@font-face` declarations removed: `yes`
- Relative / external font URLs remaining: `0`
- Downgrade disclosed: **canonical font files are not carried by this artifact.** Rendering is **environment-dependent** — a viewing system with Inter / JetBrains Mono installed locally may resolve those families from the retained stacks; another will fall through to the later generic entries. **Exact ASK typography is not guaranteed by the artifact.**

## Assembly provenance

How this timeline was produced. Generic and wall-safe — no private paths, identifiers, or payload.

- Source acquisition / export method: `[...]`
- Extractor / decoder and version: `[...]`
- Identity-resolution method: `[...]`
- Chronology and timezone normalization: `[...]`
- Merge / deduplication method: `[...]`
- Media-acquisition method: `[...]`
- Known source or assembly gaps: `[...]`

## Presentation

- Flavor: `default-ASK`
- Party mode: `two-party` | `group`

## Participant → role mapping (PERSISTENT)

This mapping is **manifest-owned and stable across refreshes**. It is never frequency-derived. A re-render must reuse these exact assignments so a person is not recolored; reassignment happens only under explicit operator intent.

A successor that deliberately adopts a newer template version reuses these assignments and records each role's bound value under that version; a value the owner changed is not a reassignment. For a successor to an `AA-compliant` archive, see the pattern README, *A successor to an `AA-compliant` archive*. A re-render from the version already recorded keeps that version's values.

| Stable sender id | Label | Archive role | Bound value |
| --- | --- | --- | --- |
| `[stable-id-author]` | `[label]` | `author` | `#8b79a2` light / `#6e5c86` dark |
| `[stable-id-1]` | `[label]` | `participant-default` | frosted |
| `[stable-id-2]` | `[label]` | `participant-a` | `#ae87c2` |
| `[stable-id-3]` | `[label]` | `participant-b` | `#bfb3d4` |
| `[stable-id-4]` | `[label]` | `participant-c` | `#c44fc4` |
| `[stable-id-5]` | `[label]` | `participant-d` | `#a56bd4` |
| `[stable-id-6]` | `[label]` | `participant-e` | `#569dbd` |

**Supported capacity: seven distinct participants total, including the author.** More than seven requires a future owner-approved overflow contract before rendering — the render must fail closed rather than cycle colors, reuse a role for two people, collapse overflow into the frosted role, invent further roles, or drop participants. This is a bounded initial capacity, not a permanent maximum.

## Media fidelity

- Profile: `embedded` | `referenced` | `mixed`

| State | Count |
| --- | --- |
| `embedded` | `0` |
| `referenced` | `0` |
| `omitted-by-export` | `0` |
| `bytes-unavailable` | `0` |

Every attachment is represented in exactly one state. Nothing is dropped silently. If any count above is non-zero, the archive's provenance disclosure must state it.

## Reactions

- Reaction representation: `none` | `structured-targeted` | `message-records` | `mixed`
- Structured targeted reaction count (in `reactions[]`): `[N]`
- Source-native reaction-message count (retained in `messages[]`): `[N]`
- Records transformed between representations: `[N]` — **`0` unless the source itself supplies the deterministic target relationship.** Where nonzero, record that relationship and how each record's sender, timestamp, and provenance were preserved. Heuristic target matching is never a warrant.
- Unresolved structured reaction count: `[N]`
- `reacted_at` available: `yes` | `no` (optional where the source does not carry it)
- Transformation / preservation policy: `[...]`

State plainly which relationships the **source recorded** and which, if any, the **consumer inferred**. A source-native reaction message stays in `messages[]` and in the message count; it is never remodelled into `reactions[]` on heuristic evidence.

## Render

- Rendered at: `YYYY-MM-DDTHH:MM:SSZ`

Tool identity, version and configuration are recorded once under **Renderer** above — do not restate them here.

## Accessibility validation

- Pattern claim: none beyond the hard-fail checklist's accessibility items — `default-ASK` makes no contrast-compliance claim.
- Final rendered archive, with content, Tier 3 overlay and custom media: `[validated | not validated]` — any accessibility claim is the consumer's, validated on the **final rendered archive**.

## Audit / freeze note

This archive is frozen at render time. Its client-side search and year navigation operate over fixed embedded content and fetch nothing. The **editable template** reads the pinned local token mirror; the **sealed HTML** inlines the token CSS and applies the declared font-sealing mode, reading no sibling stylesheet, no font sidecar, and no live upstream URL.

To re-render against newer upstream tokens or a longer span, re-sync the mirror, record a new commit SHA, and regenerate — **reusing the participant → role mapping above**. Taking a newer template version is a deliberate adoption: re-copy the template from that version and record its hash (for a successor to an `AA-compliant` archive, see the pattern README). The previous archive remains valid for audit at its recorded SHA. Regeneration produces a new artifact; supersession is history, not deletion.
