# Kuku Yalanji v24.3 Model, Training, Evaluation, and Hosting Guide

**Published:** 2026-07-15 UTC  
**Model ID:** `kuku-yalanji-nllb-lora`  
**Release:** `v24.3-joint-lexeme-dose29-s3598-20260715`  
**Run:** `v24.3-joint-lexeme-dose29-rerun1`  
**Selected checkpoint:** `J69_s3598`  
**Direction:** English (`eng_Latn`) to Kuku Yalanji (`gvn_Latn`)  
**Status:** runtime-verified research candidate; closed-set lexical gate passed; sentence translation not validated  
**Rights:** noncommercial research; upstream NLLB CC BY-NC 4.0 and source-specific data terms apply

## 1. Read this first

This is the complete handoff for the first MobTranslate Kuku Yalanji model that successfully reconstructs almost all
entries in the governed 2,724-item dictionary census under its trained `<lexeme>` task. It also preserves and improves
the measured development sentence endpoints relative to the v21.2 starting model. The adapter has been loaded and
served on both an NVIDIA RTX A6000 and MobTranslate's CPU host.

The model is working in the engineering sense: its artifact is intact, its task token is restored correctly, both
trained prefixes generate output, its CPU service fails closed during warm-up, and a CPU lexical smoke test matches
the archived A6000 prediction. The scientific claim is narrower:

| Question | Answer |
|---|---|
| Does the adapter load and generate? | Yes |
| Does `<lexeme> woman` return the governed form `jalbu`? | Yes |
| Governed 2,724-row accepted-reference exact | 2,696/2,724, or 98.9721% |
| Wilson 95% lower bound on that frozen benchmark | 98.5184% |
| Were those lexical entries shown during training? | Yes, 29 presentations each |
| Is this unseen lexical generalisation? | No |
| Is this 98.97% sentence accuracy? | No |
| Elder diagnostic exact | 0/43 |
| Speaker or community certified? | No |
| Experiment-authorized unrestricted deployment? | No |
| Appropriate current role | Downloadable, labelled research candidate and operator-requested preview |

The run's machine decision was `ADVANCE`, meaning advance to further research. Its own manifest explicitly says
`promotion_or_deployment_authorized: false`. Publishing a reproducible model and allowing an operator-requested
preview does not convert that research decision into a linguistic certification.

For known dictionary facts, deterministic lookup remains the safer product route. Neural lexical reconstruction is
useful as a capacity and regression audit, not as a replacement for the source dictionary.

## 2. Public release and API

### 2.1 Versioned API

The model registry is read-only, cross-origin accessible, and requires no API key.

| Purpose | URL |
|---|---|
| Every model and version | <https://mobtranslate.com/api/v1/models> |
| Kuku Yalanji model record | <https://mobtranslate.com/api/v1/models/kuku-yalanji-nllb-lora> |
| This immutable release | <https://mobtranslate.com/api/v1/models/kuku-yalanji-nllb-lora/versions/v24.3-joint-lexeme-dose29-s3598-20260715> |
| Current convenience alias | <https://mobtranslate.com/api/v1/models/kuku-yalanji-nllb-lora/versions/latest> |
| OpenAPI document | <https://mobtranslate.com/api/v1/models/openapi.json> |
| Human model browser | <https://mobtranslate.com/models> |

Always pin the literal version and SHA-256. `latest` is intentionally mutable.

```bash
curl -fsS \
  https://mobtranslate.com/api/v1/models/kuku-yalanji-nllb-lora/versions/v24.3-joint-lexeme-dose29-s3598-20260715 \
  | jq '.release | {version, status, metrics, artifacts}'
```

### 2.2 Model downloads

| Artifact | Bytes | SHA-256 | Download |
|---|---:|---|---|
| Complete dynamic bundle: exact v21.2 base, v24.3 adapter, server, evidence | 3,221,768,311 | `59180518ba29865a7be54968f9710b723c726237ba441036c82cd9c6a3ffe920` | [tar.gz](/model-artifacts/kuku-yalanji-nllb-lora/v24.3-joint-lexeme-dose29-s3598-20260715/kuku-yalanji-v24.3-complete-dynamic-bundle.tar.gz) |
| Adapter-only bundle: adapter, server, manifest, evidence | 1,024,897,164 | `290d5b4edc0c59001691b2537a98574a596267bf06617ce9afbd7df7396df7f4` | [tar.gz](/model-artifacts/kuku-yalanji-nllb-lora/v24.3-joint-lexeme-dose29-s3598-20260715/kuku-yalanji-v24.3-adapter-bundle.tar.gz) |
| Machine hosting manifest | 6,489 | `7366544e1c1e75c8f2c6c9e7e293acf17796e9e0244c8cecc29501185de54139` | [JSON](/model-artifacts/kuku-yalanji-nllb-lora/v24.3-joint-lexeme-dose29-s3598-20260715/HOSTING-MANIFEST.json) |
| CPU runtime verification | 1,560 | `95ef5561b6435bfa1a4058f2375998dfeeaf0ac5c7259988b1cdebf8c39d574a` | [JSON](/model-artifacts/kuku-yalanji-nllb-lora/v24.3-joint-lexeme-dose29-s3598-20260715/CPU-RUNTIME-VERIFICATION.json) |
| Release README | 4,950 | `b444deb980f2aae3bbe72ed54d38204d6ef4957754bcca33cdadd2a1295e1c26` | [Markdown](/model-artifacts/kuku-yalanji-nllb-lora/v24.3-joint-lexeme-dose29-s3598-20260715/README.md) |
| Release checksums | 1,602 | `197befed0e5784bc89c97a21c6a6ebd805d7cb0f7a5b88c6f0d9f8c31a6946d4` | [SHA256SUMS](/model-artifacts/kuku-yalanji-nllb-lora/v24.3-joint-lexeme-dose29-s3598-20260715/SHA256SUMS) |

Use the complete bundle for the shortest path to a compatible host. Use the adapter-only bundle only when the host
already has the exact v21.2 merged project base identified in section 4. Stock NLLB is not a substitute.

### 2.3 Exact training and evaluation data

| Artifact | Bytes | SHA-256 | Download |
|---|---:|---|---|
| Exact v24.3 materialized train, monitor, lexical census, development suite, and manifests | 8,405,933 | `c4990802e23d299c2f764c978b315a55cf6d39d488fb4423d73c32b7db5249b2` | [tar.gz](/datasets/kuku-yalanji-v24.3-training-20260715.tar.gz) |
| All 115,136 presented training rows | 66,606,676 | `9f99ea3c4f2a10b1dac8e4439bc8418c5589fa0dbbb21b79c994980d479b39d0` | [JSONL](/datasets/v24.3-kuku-yalanji-training-20260715/train.eng-gvn.jsonl) |
| Governed 2,724-row lexical census | 2,722,752 | `da7dc6523ea912877854ea14f0ab616f517a06c3082c696411f1245f94ecc1ed` | [JSONL](/datasets/v24.3-kuku-yalanji-training-20260715/curated-2724.eng-gvn.jsonl) |
| Frozen 2,086-row development suite | 2,998,679 | `392674d78c0dc9ded0f408474253f8cb44df96293a3effeed1d9254b6bca0306` | [JSONL](/datasets/v24.3-kuku-yalanji-training-20260715/v24-development-suite.eng-gvn.jsonl) |
| Dataset README | 1,825 | `124ce07373ed27bc82dda73f772145c5708728e31302b7400aba0db33af43a13` | [Markdown](/datasets/v24.3-kuku-yalanji-training-20260715/README.md) |
| Dataset checksums | 799 | `588ab5ae7b00615a93208e6188e59edcb1093a7bac6cb9576ebc1a77bbd8df88` | [SHA256SUMS](/datasets/v24.3-kuku-yalanji-training-20260715/SHA256SUMS) |

The compressed package is small because repeated presentations compress well. The raw JSONL preserves the exact
materialized schedule used by the trainer.

## 3. What v24.3 changed

v21.2 was good at its synthetic sentence domain but reconstructed only 48/297 historical dictionary prompts. The
diagnosis was lexical underexposure. Early v24 dose screens showed that a lexical-only objective could improve word
recall while compressing sentence outputs. v24.3 therefore used joint replay:

```text
<lexeme> woman
    -> jalbu

<translate> The woman saw the water.
    -> Jalbu-ngku bana nyajin.
```

The causal question was:

> Can increasing every governed lexeme from 13 to 29 explicit presentations, while retaining the exact non-Bible
> sentence set at two presentations, pass the frozen closed-set lexical gate without the sentence compression seen
> in lexical-heavy earlier experiments?

The changed factors were lexical repetitions, total optimizer updates, and learning-rate trajectory length. The
base weights, tokenizer lineage, sentence identities, sentence repetitions, seed, learning rate, LoRA topology,
batch size, length caps, evaluation files, and primary decoder were held fixed.

## 4. Architecture and immutable identity

### 4.1 Lineage

```text
facebook/nllb-200-distilled-1.3B
  -> MobTranslate project continuation with gvn_Latn
  -> v21.2 balanced-replay merged model
  -> v24.3 J69 LoRA + trainable <lexeme> token row
  -> selected checkpoint step 3,598
```

`gvn_Latn` is a project-added tokenizer language code. Its presence does not mean the upstream NLLB release listed
Kuku Yalanji as a supported language.

### 4.2 Required base

| File | Bytes | SHA-256 |
|---|---:|---|
| `base/model.safetensors` | 2,741,395,552 | `7f9d0fe325e9e4568e45f13179adb336b93bbd53e83ddab2826e999eba3c76f7` |
| `base/config.json` | 869 | `8b1ff7577221948cb9b9ffd9e2e64dda4e19be42c1465fe1d4b23f3a7e3e5f00` |
| `base/tokenizer.json` | 32,240,419 | `9041375d4d92d6b87628b57b64103d0ce1974559b7ccf146e871656b754fc8ed` |

The base already contains `gvn_Latn` at ID 256204 and has vocabulary size 256205. v24.3 adds `<lexeme>` at ID
256205, making the adapter tokenizer length 256206. The host must resize the base embeddings before attaching the
adapter.

### 4.3 Adapter

| Property | Value |
|---|---|
| PEFT type | LoRA, `SEQ_2_SEQ_LM` |
| Rank / alpha / dropout | 32 / 64 / 0.0 |
| Target modules | `q_proj,k_proj,v_proj,out_proj,fc1,fc2` |
| Trainable task token | `<lexeme>`, ID 256205 |
| Adapter weights | 1,238,280,624 bytes |
| Adapter SHA-256 | `dd61583a60df2d538989e963e104cb626d78965d300e4e473e9a82ef59c04502` |
| Adapter config SHA-256 | `a8a423baf16fed5269e1c8390dfe82669b38a8ca6c957afeceb379c7347e8d85` |
| Adapter tokenizer SHA-256 | `e78a1959568aeaf5f72abac76f6e5dd63c72157d991ef11e4bb34e474c3f54be` |

The adapter is much larger than the 47.2 million LoRA parameters alone would imply. PEFT persisted full selective
token embedding/output matrices along with the trainable `<lexeme>` row. That is correctness-preserving but adds
roughly a gigabyte and raises dynamic CPU memory. Do not strip those tensors without an adapter-versus-repacked
parity test over the full benchmark.

## 5. Loading the model

### 5.1 Proven package versions

The successful RunPod run used:

```text
Python        3.11.10
PyTorch       2.4.1+cu124
Transformers  4.48.3
PEFT          0.19.1
Accelerate    1.14.0
Datasets      4.8.5
SacreBLEU     2.6.0
SentencePiece 0.2.2
GPU           NVIDIA RTX A6000 48GB
```

### 5.2 Dynamic PEFT load

```python
import torch
from peft import PeftModel
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float16 if device == "cuda" else torch.float32

tokenizer = AutoTokenizer.from_pretrained(
    "./adapter",
    src_lang="eng_Latn",
    tgt_lang="gvn_Latn",
)
base = AutoModelForSeq2SeqLM.from_pretrained(
    "./base",
    torch_dtype=dtype,
)

if base.get_input_embeddings().num_embeddings != len(tokenizer):
    base.resize_token_embeddings(len(tokenizer))

model = PeftModel.from_pretrained(
    base,
    "./adapter",
    is_trainable=False,
    low_cpu_mem_usage=True,
)
model.to(device=device, dtype=dtype)
model.eval()
```

The final dtype conversion matters. In a real CPU preflight, the base loaded as float32 while restored selective
token/output tensors remained bfloat16, causing `float != c10::BFloat16` in the output projection. Normalizing the
complete PEFT model fixed the mismatch. The reference service refuses readiness if its warm-up generation fails.

### 5.3 Generate by task

```python
def generate(text: str, task: str) -> str:
    if task not in {"lexeme", "translate"}:
        raise ValueError("task must be lexeme or translate")

    prefix = "<lexeme> " if task == "lexeme" else "<translate> "
    inputs = tokenizer(
        prefix + text,
        return_tensors="pt",
        truncation=True,
        max_length=128,
    ).to(device)

    if task == "lexeme":
        decoder = dict(
            max_new_tokens=32,
            num_beams=1,
            no_repeat_ngram_size=0,
            repetition_penalty=1.0,
            length_penalty=1.0,
        )
    else:
        decoder = dict(
            max_new_tokens=208,
            num_beams=1,
            no_repeat_ngram_size=4,
            repetition_penalty=1.10,
            length_penalty=1.0,
        )

    with torch.inference_mode():
        output = model.generate(
            **inputs,
            forced_bos_token_id=tokenizer.convert_tokens_to_ids("gvn_Latn"),
            **decoder,
        )
    return tokenizer.batch_decode(output, skip_special_tokens=True)[0]
```

The lexical decoder above exactly matches the selected lexical evaluation. The guarded sentence policy is an
operational preview setting inherited from the separately frozen v21.2 decoder-transfer study. The controlled
v24.3 sentence results in section 9 used the neutral evaluation decoder: beam 1, 32 new tokens, no repeat guard,
repetition penalty 1.0, and length penalty 1.0.

## 6. Reference HTTP service

The complete bundle includes `serve_v2_infer.py`.

```bash
python serve_v2_infer.py \
  --model-dir ./base \
  --adapter-dir ./adapter \
  --adapter-sha256 dd61583a60df2d538989e963e104cb626d78965d300e4e473e9a82ef59c04502 \
  --model-id v24.3-joint-lexeme-dose29-s3598-20260715 \
  --host 127.0.0.1 \
  --port 7955 \
  --dtype float32 \
  --threads 4 \
  --max-chars 400 \
  --max-waiting 2 \
  --max-time 45
```

Health:

```bash
curl -fsS http://127.0.0.1:7955/health | jq
```

Lexical reconstruction:

```bash
curl -fsS -H 'content-type: application/json' \
  --data '{"text":"woman","task":"lexeme"}' \
  http://127.0.0.1:7955/translate | jq
```

```json
{
  "translation": "jalbu",
  "kuku": "jalbu",
  "model": "v24.3-joint-lexeme-dose29-s3598-20260715",
  "task": "lexeme",
  "sourceLang": "eng_Latn",
  "targetLang": "gvn_Latn"
}
```

Sentence research preview:

```bash
curl -fsS -H 'content-type: application/json' \
  --data '{"text":"The woman saw the water.","task":"translate"}' \
  http://127.0.0.1:7955/translate | jq
```

Measured smoke output:

```text
Jalbu-ngku bana nyajin.
```

The server binds loopback, permits one active generation, bounds its wait queue, rejects oversized input, and returns
429 when saturated. Put authentication, TLS, rate limits, and public labels in the reverse proxy or caller.

## 7. Measured resources

### 7.1 Training

| Measurement | Result |
|---|---:|
| GPU | NVIDIA RTX A6000 48GB |
| Peak GPU memory | 36,586 MiB |
| Peak process RSS | 8,209.9 MiB |
| Training runtime | 3,863.3048 seconds, or 64.39 minutes |
| Samples per second | 29.802 |
| Optimizer steps per second | 0.931 |
| Total training FLOPs reported | 4.296e16 |

The 36.6 GiB peak includes training-state and checkpoint behavior. Inference does not require a 48GB GPU, but the
minimum should be measured on the intended stack instead of inferred from parameter size.

### 7.2 Dynamic CPU serving

The CPU test used an eight-vCPU AVX2-only Haswell virtual host, four Torch threads, float32, no model-process swap,
and one active generation.

| Measurement | Observed |
|---|---:|
| Peak cgroup memory | 8,591,966,208 bytes, or 8.00 GiB |
| Settled process RSS | about 7.0-7.2 GiB |
| Warm-up generation | 40.5-45.3 seconds after model load |
| Single-request latency | 4.9-23.2 seconds |
| Stable concurrent generations | 1 |

The broad latency range was caused by variable page-cache and mounted-disk pressure on a shared VPS. It is evidence
that the CPU runtime works, and also evidence that this dynamic form is not a good high-throughput service on that
box. A GPU host is preferred. A correctly merged model should remove duplicated adapter embedding storage, but no
merged v24.3 bundle should be released until its predictions match the dynamic adapter on the frozen suites.

## 8. Exact training treatment

### 8.1 Materialized mixture

| Class | Unique rows | Presentations per row | Presented rows | Source tokens | Target tokens |
|---|---:|---:|---:|---:|---:|
| Governed dictionary lexemes | 2,724 | 29 | 78,996 | 441,902 | 384,569 |
| Synthetic academic sentences | 16,642 | 2 | 33,284 | 713,552 | 704,692 |
| Dictionary usage examples | 1,428 | 2 | 2,856 | 113,064 | 33,416 |
| **Total** | **20,794** | mixed | **115,136** | **1,268,518** | **1,122,677** |

Total non-padding tokens were 2,391,195. Every materialized row was seen once by the trainer. There were no Bible
rows in the v24.3 positive objective.

The 115,136 count is not a claim of 115,136 independent speaker-attested examples. It is a deterministic presentation
schedule built from 20,794 unique lexical or sentence rows. Most sentence material is synthetic and pending fluent
speaker review.

### 8.2 Data contracts

- The 18,070 unique sentence rows were retained from the v21.2 treatment after excluding 4,094 verse rows.
- Sentence train and sentence validation had zero normalized source overlap.
- Sentence train and sentence validation had zero normalized target-surface overlap.
- The 128-row optimization monitor was balanced between 64 lexical and 64 sentence records.
- Its lexical half overlapped training by design and was labelled an optimization diagnostic.
- The 2,724-row census was evaluated at every saved checkpoint.
- The 2,086-row retention suite was evaluated at every saved checkpoint.
- Final tests for unseen lexical uptake, morphology, and speaker-diverse natural translation were not opened because
  those governed test resources do not yet exist at sufficient scale.

### 8.3 Training command

The archived driver enforced hashes, row counts, token identities, and fresh output roots before running this recipe:

```bash
python scripts/train_nllb_lora.py \
  --base-model ./base_model/merged \
  --train-file data/joint/train.eng-gvn.jsonl \
  --validation-file data/joint/validation.eng-gvn.jsonl \
  --output-dir models/J69 \
  --model-version v24.3-J69-rerun1 \
  --run-id v24.3-J69-seed17-rerun1 \
  --dataset-id v24.3-joint-lexeme-dose29 \
  --direction eng-gvn \
  --source-lang eng_Latn \
  --target-lang gvn_Latn \
  --additional-special-token '<lexeme>' \
  --trainable-token '<lexeme>' \
  --max-steps 3598 \
  --epochs 999 \
  --batch-size 32 \
  --gradient-accumulation-steps 1 \
  --max-source-length 128 \
  --max-target-length 128 \
  --learning-rate 2e-4 \
  --warmup-ratio 0.05 \
  --weight-decay 0.0 \
  --lora-r 32 \
  --lora-alpha 64 \
  --lora-dropout 0.0 \
  --lora-target-modules q_proj,k_proj,v_proj,out_proj,fc1,fc2 \
  --eval-steps 900 \
  --save-steps 900 \
  --save-total-limit 4 \
  --generation-num-beams 1 \
  --generation-no-repeat-ngram-size 0 \
  --generation-repetition-penalty 1.0 \
  --generation-length-penalty 1.0 \
  --seed 17 \
  --full-determinism \
  --no-shuffle-before-cap \
  --no-load-best-model-at-end \
  --no-merge-full-model
```

The effective endpoint saves were 900, 1,800, 2,700, and 3,598. `max_steps`, not epoch count, was the operative
training contract.

## 9. Evaluation results

### 9.1 Closed-set lexical reconstruction

Accepted-reference scoring permits only forms explicitly attached to the governed prompt. It does not grant credit
for an arbitrary dictionary word.

| Checkpoint | Step | Accepted exact | Percent | Wilson 95% lower | Joint gate |
|---|---:|---:|---:|---:|---|
| J69_s0900 | 900 | 1,289/2,724 | 47.3201% | 45.4503% | Fail |
| J69_s1800 | 1,800 | 2,321/2,724 | 85.2056% | 83.8227% | Pass |
| J69_s2700 | 2,700 | 2,633/2,724 | 96.6593% | 95.9161% | Fail: one blank usage output |
| **J69_s3598** | **3,598** | **2,696/2,724** | **98.9721%** | **98.5184%** | **Pass** |

The final 28 failures were:

| English prompt | Prediction | Governed accepted form(s) |
|---|---|---|
| a long time ago | `wuljay-wuljay` | `ngadiku` |
| brown and green pigeon | `jinkalmu` | `kujuway` |
| brown snake | `kungkun` | `jinkalmu` |
| cherry | `kabariji` | `marrku` |
| crab | `wurru-budu` | `wurru-bulan` |
| dawn, daybreak | `mudu wayjul` | `muduwaju` |
| five corner nut | `bijikan` | `bijalabay` |
| flathead fish | `dukul-baral` | `dukul-barangkal` |
| glue | `janbangal` | `janbay-manil` |
| golder whistler | `dukunjulu` | `dukunjuju` |
| ground | `dirrmbay` | `balay`; `bubu` |
| larvae of green ants | `kawa` | `kurrmaja` |
| lawyer cane | `kaku` | `mawar`; `milmarr` |
| lizard | `jirabay` | `bajabaja`; `bajuy`; `kalkarrumbarr`; `murrbun` |
| runny tummy | `ngiki-dandi` | `kidi-wanarri` |
| small mud clam | `baymbay` | `darkay` |
| small tree | `kalbanbina` | `wada`; `wangku` |
| snapper island | `Ngalkunbu` | `Baku`; `Yibuy-karrbaja` |
| stalk | `jarrkal` | `karangaji` |
| The Daintree side of Rocky Point | `Jiwukal` | `dubar kalbay` |
| to hang up | `walngkal` | `walngkan-damal` |
| tree (this term is very rarely used for money) | `jungka` | `jangka` |
| underwater | `kurmba` | `kural` |
| wash | `julurril` | `janjil` |
| wild peasun | `kalbawurr` | `kuralbi` |
| yellow March fly | `marrku` | `kamay` |
| yellow ochre | `makarra` | `makirr` |
| yellow water snake | `kabuljaka` | `barka` |

The machine taxonomy classified 25 failures as a known target for another prompt, two as near-orthographic, and one
as other. That concentration suggests residual sense competition and lexical interference, not simple failure to
produce Kuku Yalanji-shaped strings. The full row records include part of speech, semantic domain, token counts,
closest reference, grapheme error, and checkpoint trajectory.

### 9.2 Why the older 297 benchmark reports 91/297

The same final checkpoint scored only 91/297 exact on the older historical benchmark. This is not a contradiction:

- only 208 of the 297 historical prompts overlap the governed 2,724-prompt census;
- accepted-reference surfaces differ across the two resources;
- 206/208 overlapping predictions were supported by the governed census;
- 89 prompts exist only in the historical resource;
- sense, source, spelling, variety, and curation differences remain unresolved.

Therefore the project reports each benchmark against its own frozen accepted-reference set. It does not merge them
through automated string similarity and does not call either result population-level user-query reliability.

### 9.3 Sentence retention

All figures below are development diagnostics under one fixed neutral decoder. B0 is untouched v21.2.

| Endpoint | Rows | B0 chrF++ | v24.3 chrF++ | Delta | B0 exact | v24.3 exact |
|---|---:|---:|---:|---:|---:|---:|
| Synthetic development | 1,609 | 47.7228 | 58.1852 | +10.4623 | 396 | 857 |
| Natural Text 3/6 development | 53 | 30.6348 | 36.2295 | +5.5947 | 0 | 0 |
| Usage diagnostic | 84 | 48.4123 | 53.1698 | +4.7575 | 3 | 6 |
| Elder-shared regression diagnostic | 43 | 24.6161 | 25.2817 | +0.6656 | 0 | 0 |

Every selected-checkpoint hard retention check passed, including zero blank outputs and no increase in the tagged
loop detector. This is encouraging retention evidence, not proof of natural competence:

- the experiment used one seed;
- model selection used development data;
- the 43 elder-shared rows have been repeatedly inspected;
- elder exact remains 0/43;
- elder mean token-length ratio is 0.5925 and 12/43 outputs are below half the reference token length;
- natural rows are not sufficiently speaker-, text-, genre-, or variety-diverse;
- automatic overlap cannot establish argument structure, case, TAM, polarity, discourse, or cultural suitability.

### 9.4 What the result does establish

It establishes that under this exact base, tokenizer, task prefix, data schedule, seed, optimizer path, and benchmark:

1. explicit repeated lexical supervision can drive near-complete closed-set reconstruction;
2. joint sentence replay prevented the broad sentence collapse seen in earlier lexical-heavy treatments;
3. the final checkpoint passes both the frozen lexical and development-retention gates;
4. residual lexical failures are concentrated in competing known targets and close forms;
5. further free-form claims require different evidence, not a larger number attached to the same closed set.

## 10. Product routing

Recommended current routing is:

```text
known dictionary query
  -> deterministic dictionary lookup with source, sense, and variety metadata

research lexical reconstruction audit
  -> v24.3 task=lexeme

English sentence research preview
  -> v24.3 task=translate
  -> visible unverified-machine-draft label
  -> no high-stakes use

new or rare word in sentence
  -> retrieve a small relevant glossary
  -> future glossary-conditioned model, after separate evaluation
```

Every response or event log should preserve:

- source text;
- generated or retrieved target text;
- route (`dictionary_exact`, `v24.3_lexeme`, `v24.3_translate`, hosted fallback);
- immutable model version;
- adapter SHA-256;
- task prefix;
- decoder policy;
- latency and error state.

Raw user text may be sensitive. Set a short retention period, restrict access, provide deletion, and do not reuse logs
for training without separate consent and governance.

## 11. Hosting multiple Aboriginal language adapters

LoRA makes a shared-base service feasible, but only under a strict compatibility contract.

### 11.1 What can be shared

One GPU process can keep a single encoder-decoder base resident and load, switch, or hotswap named adapters. This can
reduce duplicate base memory and startup cost. PEFT supports multiple adapters and hotswapping for compatible LoRA
configurations.

### 11.2 What must match

Adapters intended for one shared worker must agree on:

- exact base model weights and revision;
- model architecture and PEFT task type;
- target module set;
- compatible rank policy or a preallocated maximum rank;
- tokenizer files and token IDs;
- source and target language-code IDs;
- task-prefix token IDs;
- generation contract expected by the router.

Current MobTranslate language models do not automatically satisfy this. v24.3 is based on the exact v21.2 Kuku
Yalanji continuation and adds `<lexeme>` at ID 256205. A Mi'gmaq adapter trained against another base or tokenizer
cannot simply be attached to this process.

### 11.3 Recommended next-generation base contract

For future languages:

1. choose and checksum one shared NLLB base;
2. reserve all approved language codes and task tokens before any adapter training;
3. freeze and publish that tokenizer as a platform base version;
4. train one adapter per language first, using the same target modules and rank;
5. keep dictionary lookup outside the model;
6. evaluate every adapter independently on lexical, morphology, sentence, degeneration, and human-review gates;
7. load adapters on demand with a bounded LRU cache;
8. route by immutable `(base_version, adapter_version, tokenizer_hash, decoder_policy)`;
9. do not let one language's benchmark authorize another language;
10. explore a language-family adapter only as a controlled transfer experiment, because shared training can help or
    cause cross-language interference.

The limiting work is not attaching another LoRA. It is governed data, language-specific morphology, independent
natural evaluation, fluent-speaker review, rights, and authority over release.

### 11.4 Adapter-only storage is not automatically small

v24.3 demonstrates an operational issue: adding a trainable tokenizer row caused PEFT to save full embeddings. For a
future shared platform, test PEFT trainable-token serialization and `save_embedding_layers=False` in an isolated
parity study. Never apply that optimization retroactively without verifying every frozen prediction, because a small
bundle that drops the learned task row is not the same model.

## 12. Reproduction and verification

### 12.1 Download and verify

```bash
curl --fail --location --continue-at - \
  --output kuku-yalanji-v24.3-complete-dynamic-bundle.tar.gz \
  https://mobtranslate.com/model-artifacts/kuku-yalanji-nllb-lora/v24.3-joint-lexeme-dose29-s3598-20260715/kuku-yalanji-v24.3-complete-dynamic-bundle.tar.gz

echo '59180518ba29865a7be54968f9710b723c726237ba441036c82cd9c6a3ffe920  kuku-yalanji-v24.3-complete-dynamic-bundle.tar.gz' \
  | sha256sum -c -

tar -xzf kuku-yalanji-v24.3-complete-dynamic-bundle.tar.gz
cd kuku-yalanji-v24.3
sha256sum base/model.safetensors adapter/adapter_model.safetensors
```

Expected internal identities:

```text
7f9d0fe325e9e4568e45f13179adb336b93bbd53e83ddab2826e999eba3c76f7  base/model.safetensors
dd61583a60df2d538989e963e104cb626d78965d300e4e473e9a82ef59c04502  adapter/adapter_model.safetensors
```

### 12.2 Minimum acceptance checks for another host

1. Bundle hash matches.
2. Internal base, adapter, config, and tokenizer hashes match.
3. `gvn_Latn` resolves to ID 256204.
4. `<lexeme>` resolves to one special token at ID 256205.
5. Input and output embedding dimensions equal tokenizer length 256206 after resize.
6. Model and output projection dtypes agree.
7. Health remains unready until a real warm-up generation passes.
8. `task=lexeme, text=woman` returns exactly `jalbu`.
9. Both sentence smoke rows return the manifest outputs under the documented preview decoder.
10. Invalid tasks return 400, oversized input returns 413, and a saturated queue returns 429.
11. A representative frozen batch matches the archived dynamic-adapter predictions.
12. Host publishes the immutable version, route, research label, rights, and decoder policy.

### 12.3 Merging

Merging can reduce dynamic overhead, but it is a new serialized artifact. A merged release is acceptable only if:

- it starts from the exact base hash;
- the base is resized before PEFT load;
- tied encoder, decoder, shared, and output embeddings are canonicalized;
- model and tokenizer are saved together;
- adapter and merged outputs match on all 2,724 lexical rows and all 2,086 retention rows under both relevant
  decoder contracts;
- the merged model receives a new immutable SHA-256 and manifest entry.

Smoke-row agreement alone is insufficient.

## 13. Rights, governance, and public claims

The upstream NLLB checkpoint is released under CC BY-NC 4.0 and its model card describes it as a research model,
not a production deployment. It is designed principally for single-sentence translation and carries domain and
language-variety limitations.

This project also distinguishes:

- code licence;
- upstream model licence;
- dictionary source rights;
- synthetic-corpus release terms;
- speaker or narrative permissions;
- training permission;
- data redistribution permission;
- derived-weight redistribution permission;
- third-party host transfer permission;
- Indigenous Cultural and Intellectual Property and collective authority.

Public availability answers only some of those questions. It does not establish community authority. Current model
outputs must be labelled as unverified drafts and must not be represented as speaker-certified, community-approved,
or authoritative. Do not use them for health, legal, emergency, ceremonial, or culturally sensitive communication.

## 14. Known limitations and next research

The next useful work is not more epochs over the same closed-set dictionary. That objective is already near
saturation. Priority evidence is:

1. speaker-reviewed sense decisions for the 28 residual lexical failures;
2. inference-time lexicon uptake, where a held-out mapping is supplied in a glossary and must be used in a novel
   sentence;
3. morphology tests that expose a lemma and hold out attested inflected or derived forms;
4. grammatical challenge sets covering participant roles, case, polarity, TAM, transitivity, clitics, subordination,
   reduplication, and discourse reference;
5. multiple independent speaker, text, genre, occasion, and variety clusters;
6. blinded fluent-speaker adequacy, grammaticality, naturalness, and critical-error review;
7. multi-seed confirmation of the selected recipe;
8. adapter repacking and merged-model parity work for lower hosting cost;
9. retrieval-conditioned translation that sends only relevant glossary entries rather than an entire dictionary.

## 15. Primary technical references

- [NLLB-200 distilled 1.3B model card](https://huggingface.co/facebook/nllb-200-distilled-1.3B)
- [Fine-tuning NLLB-200 for a new language](https://huggingface.co/blog/FormosanBank/nllb-200-mt)
- [PEFT hotswap API](https://huggingface.co/docs/peft/main/package_reference/hotswap)
- [Transformers PEFT integration](https://huggingface.co/docs/transformers/en/main_classes/peft)
- [PEFT trainable-token documentation](https://huggingface.co/docs/peft/en/package_reference/trainable_tokens)
- [Language-family adapters for low-resource NMT](https://aclanthology.org/2023.loresmt-1.5/)

## 16. Citation

```text
MobTranslate. 2026. Kuku Yalanji v24.3 Model, Training, Evaluation, and Hosting Guide.
Release v24.3-joint-lexeme-dose29-s3598-20260715.
https://mobtranslate.com/docs/kuku-v24-3-model-guide.html
```

When reporting the lexical result, use this wording:

> The v24.3 model reconstructed 2,696 of 2,724 accepted dictionary records exactly on a governed,
> training-overlapping closed-set census under the `<lexeme>` task. This is a reconstruction result, not unseen-word
> generalisation or sentence-translation accuracy.
