# Hachimoji DNA Encoding Specification

**Version:** 0.1
**Status:** Draft
**Purpose:** Computational substrate, not compression format.

## 1. Alphabet

Eight bases, ASCII-ordered for monotone lexicographic sorting:

| Index | Base | Phase | Bits |
|-------|------|-------|------|
| 0 | A | 0° | 000 |
| 1 | B | 45° | 001 |
| 2 | C | 90° | 010 |
| 3 | G | 135° | 011 |
| 4 | P | 180° | 100 |
| 5 | S | 225° | 101 |
| 6 | T | 270° | 110 |
| 7 | Z | 315° | 111 |

**Key property:** ASCII sort order = index order = lexicographic rank.
This means `sorted(sequences)` produces the same order as `sorted(sequences, key=dna_to_int)`.

## 2. Symbol Encoding

Each symbol (byte, word, or chunk) maps to a fixed-length DNA sequence.

- **1-byte chunks:** 256 symbols → 3 bases/symbol (8³ = 512 ≥ 256)
- **2-byte chunks:** 65,536 symbols → 6 bases/symbol (8⁶ = 262,144 ≥ 65,536)
- **n unique symbols:** `ceil(log₈(n))` bases/symbol

The LUT assigns sequences by rank:
- Rank 0 → "AAA...A" (lowest)
- Rank 1 → "AAA...B"
- Rank n → highest sequence

## 3. Monotone Property

If symbols are ranked by frequency (most frequent = rank 0), then:
- Most frequent symbol → shortest/lowest DNA sequence
- Lexicographic sort of DNA = frequency sort of symbols
- This is NOT compression — it's structured representation

## 4. LUT Format

```json
{
  "format": "hachimoji_lut_v1",
  "bases": "ABCGPSTZ",
  "chunk_size": 1,
  "bases_per_symbol": 3,
  "entries": {
    "AAA": "20",
    "AAB": "65",
    "AAC": "74"
  }
}
```

- Keys: DNA sequences (base-8 encoded ranks)
- Values: hex-encoded byte chunks
- Portable: JSON, human-readable, self-describing

## 5. File Format

```
.dna file:  raw DNA sequence (text, A-Z only)
.lut file:  JSON LUT (see above)
.meta file: encoding metadata (optional JSON)
```

## 6. Roundtrip Guarantee

```
decode(encode(data)) == data
```

Verified at encode time. No lossy steps. No approximation.

## 7. Computational Properties

The DNA sequence is not just encoded data — it's a computational address:

- **Sequence index** (base-8 integer) = symbolic rank
- **Lexicographic order** = rank order (monotone)
- **LUT lookup** = O(1) per symbol
- **Sortable** by standard string sort (= rank sort)
- **Portable** across systems (plain text + JSON)

## 8. Integration with SilverSight

- `HachimojiCodec.lean` — formal encode/decode specification
- `HachimojiLUT.lean` — LUT hierarchy (k=2, k=6, k=50)
- `PhaseCircle` — ℤ/360ℤ address space
- `dna_lut.py` — Python LUT implementation
- `dna_encode_file.py` — file encoder/decoder

## 9. Not This

- ❌ Not a compression format (bits/byte not the goal)
- ❌ Not a DNA storage format (no synthesis/sequencing constraints)
- ❌ Not a cryptographic scheme (no security claims)
- ✅ A computational substrate for manifold/QUBO/eigenvalue work
