Extension protocols and implementation status

Status: implementation granted and partially landed; P1’s fitted probe is still unmeasured. P1’s offline data/identity foundation, P2’s artifact and offline evaluator, and P3’s artifact, registry entries, and L3 inlet/executor are implemented and fixture-tested in this tree (per-partition state in §5). Measurement has since followed for two of the three: P3’s case-word influence sweep is scored (decision 121), P2’s offline comparator arms and zero-shot probe arms are recorded, and P1’s warm-up compute gate is measured (decision 122), while P1’s fit pipeline itself has not run. Those values live in data/claims.json and are reported in the manuscript, not here; the sections below are the protocols as proposed. This file is deliberately outside design/ — that directory holds adopted past-tense decision records, and the measured arms remain governed by their own sequenced registrations. No experiment may be marked complete on the strength of this file. Proposal-era present/future tense in the detailed protocol sections is historical; use the current status below and each actual recorder receipt when planning work.

The connected runtime is now implemented separately from the original P3 seam. Its raw-text path derives a delayed lexical UPOS observation from word beliefs; P3’s earlier fixed-UPOS role-to-word influence estimand remains distinct. The connected GUM comparison uses a frozen population and fixed channel setting, not a retroactive claim that P3’s development sweep improved a whole pipeline. See the connected contract and the GUM data scope.

The local registry described in §1 is not the identity of today’s hosted synthetic/in-context model. Those recorders disclose the configured hosted model and retain cohort suffixes for protocol accounting. Current loader, context, endpoint and budget contracts live in the benchmark package guide; the dated metadata below cannot override them.

It responds to the three open Major items in ../TODO.md:

TODO item Protocol here Short form
“Equal opportunity to fit the task” §2 Fit an actual registered probe’s parameters offline on the task
“Extend the stipulated-artifact design to aligned pronunciation” §3 Pair-structured stipulated artifact, distinct from the shipped phone-chain arm
“The end-to-end top-down cascade is blocked by data provenance” §4 The TODO-required label/split/observation account, built before any artifact

Design discipline: cite code by path::symbol; every quantitative statement is either a claim:-tagged ledger reference, a vendored-artifact field named in inline code, a protocol constant, or an explicitly labeled estimate. No new comparator, calibration relabeling, prompt tweak, or in-context example is presented as a substitute for a fitted arm anywhere below.

Sources actually inspected while drafting (small official metadata/config/license reads only; no weights downloaded, no inference run): local ollama show output for the three registered tags; https://huggingface.co/api/models/HuggingFaceTB/SmolLM-1.7B and https://huggingface.co/api/models/Qwen/Qwen2.5-3B-Instruct (model cards, config lineage, licenses); the official mlx-lm fine-tuning documentation (https://raw.githubusercontent.com/ml-explore/mlx-lm/main/mlx_lm/LORA.md and the repo README.md); https://docs.ollama.com/ for the import path; plus every repository file cited below. A gemma3 HF checkpoint could not be read without license acceptance; that limitation is recorded where it matters (§2.8).


1. The three registered probes, verified identity (evidence)

src/ailm/benchmarks/constants.py::SERVED_PROBES (lines 395–409) registers exactly three systems, validated at import by validate_served_probes. Identity facts below were read from the local Ollama registry (ollama show <tag>) on 2026-09-08; they predate the metadata-identity epochs of decisions 124-126, in which the derived digests moved while the weights blobs did not — re-read the live registry at implementation time and record the then-current digests; the upstream lineage is traced from official metadata, and every row states what is verified versus what must be pinned at implementation time.

Registered key Ollama tag ollama show (verified locally) Upstream lineage License (as reported) Fit backend family
gemma3 gemma3:4b gemma3 arch; completion and vision capabilities; Gemma Terms of Use Instruct/multimodal line; exact HF checkpoint gated behind Gemma license acceptance Gemma Terms of Use Unresolved — gemma3 is not in mlx-lm’s documented LoRA family list; see options in §2.8
qwen25 qwen2.5:3b qwen2 arch; completion + tools; ships the Qwen system prompt → instruct lineage; Qwen RESEARCH LICENSE AGREEMENT text Qwen/Qwen2.5-3B-Instruct (HF card: qwen-research license, base model Qwen/Qwen2.5-3B, qwen2 architecture) — verified via HF API Qwen research license: non-commercial research use; derivative redistribution per license terms mlx-lm documented LoRA family (Qwen2)
smollm smollm:1.7b-base-v0.2-q4_K_M llama arch; completion-only (base model, no chat template); Apache License 2.0 SmolLM 1.7B base line: HuggingFaceTB/SmolLM-1.7B (HF: LlamaForCausalLM, llama model type, Apache-2.0, ungated; card reports full-precision footprint 3422.76 MB) — verified via HF API. The v0.2 tag suffix denotes the refreshed base checkpoints of that same line Apache-2.0 mlx-lm documented LoRA family (Llama)

Fidelity notes the protocol fixes, not optional caveats:


2. Protocol P1 — a fitted external probe arm

2.1 What exists today (the measured baseline this protocol extends)

The external benchmark (src/ailm/benchmarks/) already runs the three probes and AILM’s own decoders on identical next-symbol tasks, positions, prompts, and scoring:

The supplement’s fairness table (manuscript/98_supplement_external_benchmarks.md, “What a comparison would need”) records that the condition “Both systems have the same opportunity to fit the task” holds in no arm as run. The in-context arm supplies labeled transitions through the prompt and measures that bounded intervention; the fitted-probe arm is the first design in which the condition could hold, which is exactly what the TODO demands.

2.2 What gets fitted — and the explicit list of what does not qualify

What is fitted: low-rank adapters on the upstream checkpoints of the registered lineages, trained offline on the task’s training material, then fused and scored through the same server contract. Concretely, per task:

Task Fit material (train side only) SFT format Evaluated on
Letter The normalized Brown stream regenerated from the pinned NLTK brown.zip recorded in vendor/brown_counts.json provenance.raw_source (revision 550b6625…, source_sha256 recorded) under the artifact’s recorded normalization string; instances per the deterministic policy below The exact build_prompt("letter", …) format, completions-style, gold = the stream’s next character The frozen census positions on LETTER_TEXT (folklore passage — a different corpus than Brown, so eval-position disjointness holds by construction and is digest-asserted)
Phoneme Phone streams of the train pairs from g2p_split; instances = (prefix window, next phone) in the exact phoneme prompt format Same, phoneme task The frozen test-side positions (400 population)
G2P Train pairs (word, gold phone array) from the same stride split completions format: {"prompt": build_prompt("g2p", word), "completion": <JSON gold>} The frozen test-side words (400 population)

Deterministic training-instance policy (declared before any evaluation):

This is a genuine offline parameter fit on the task: gradient updates to learned parameters, frozen and digested before any scored call. It is not any of the following, each excluded by the TODO’s framing and recorded here as a refusal boundary, not a gap:

2.3 Arms, artifact identity, and the registry boundary

Because the fit target is the upstream checkpoint (in the trainer’s precision), not the served GGUF blob, each registered probe family gains a declared arm set:

Arm Identity Role
Registered (existing) SERVED_PROBES tag, Q4_K_M Published reference; untouched
Upstream-unfitted control Upstream checkpoint → fused → converted GGUF → local Ollama tag The treatment’s paired control through the identical export pipeline
Upstream-fitted treatment Upstream checkpoint + LoRA adapter fused → converted GGUF → local Ollama tag The fitted arm

Registry boundary. The fitted arms do not enter SERVED_PROBES. That registry is the single identity source for every historical bench family, and adding to it would silently rewrite live surfaces:

Repair: a separate experimental registry FITTED_PROBES, defined in src/ailm/benchmarks/fitted/identity.py with its own import-time validator (the validate_served_probes dedup discipline on a new namespace), consumed only by the fitted recorder, its tests, and explicitly listed consumers. Historical SERVED_PROBES, its populations, and its namespaces are untouched; no historical namespace is rewritten (the earlier “nothing is re-recorded” claim was false at the registry surface and is withdrawn). Cache identity still binds every scored call to the fitted weights via resolved_model_identity — distinct local tags give distinct digests and distinct keys.

Identity requirements (all implementation-time, all digested):

  1. Fitted-registry entries (above) — never SERVED_PROBES entries.
  2. Upstream revision pin: HF repo id + commit sha256 recorded before the fit, in a new provenance record under the vendored-artifact discipline (provenance/sources.md entry with digests; see provenance/AGENTS.md for the regeneration contract).
  3. Adapter artifact: config (rank, layers, schedule) + learned weights + training-loss curve, written once, digested, never overwritten (synthetic_protocol.py’s frozen-contract discipline is the template).
  4. Merged/converted artifact digest and the local Ollama tag it was imported under (official import path: a Modelfile whose FROM names the converted GGUF — see https://docs.ollama.com/), recorded so the cache identity of every scored call binds to the fitted weights, exactly as resolved_model_identity binds registered calls today.
  5. A new protocol namespace (fitted-probe-v1, the pattern of CALIBRATION_FLOOR_PROTOCOL) with its own cache protocols, so no key can collide with any existing arm; repeat-trial scoping reuses repeat_trial_protocols with a fresh run scope.
  6. The digest chain establishes lineage: upstream revision digest → adapter digest → fused-model digest → converted-GGUF digest → served-tag identity (resolved_model_identity), recorded as one receipt before any scored call. Lineage rests on this chain; behavioral agreement checks only validate operation (§2.6).
  7. Precision and quantization choices (proposed, not run). Primary: LoRA on the bf16 MLX upstream, fuse at full precision, convert with llama.cpp, quantize to Q4_K_M. Rationale: the identical conversion/quantization pipeline applied to treatment and control makes quantization a controlled common factor of the specified paired comparison, and keeps fitted numbers in the registered arms’ quantization family. A Q8_0 sensitivity rung is optional. QLoRA (fitting against an MLX-quantized base) is the declared fallback; it changes the fused artifact’s identity (quantized base + adapter) and would be recorded as such. Matched quantization supports the paired comparison; it does not establish identity with the historical served weights, does not remove transformation effects, and the fit-by-quantization interaction (the adapter is absorbed before quantization) stays declared.

2.4 What is and is not equalized (declared, per condition)

Condition (the supplement’s six) Status under P1
Same items, scoring rule, denominator Holds as shipped; unchanged
The score measures the ability the task names Still fails on the full-inventory letter arm (willingness to emit a non-alphabetic symbol is not next-symbol ability); the letter fit inherits this, and both letter readings stay reported separately
Neither system has prior exposure to the evaluation corpus Unchanged: unverifiable for the probes; letter-arm corpus disjointness holds by construction, the CMUdict stride split by code
Same opportunity to fit the task Holds by construction for the first time: both systems receive offline parameter estimation on the same training material under the census policy above. Declared residual: the estimator classes still differ (count-estimated matrix vs gradient-fitted adapter) — the condition is equalized, the compared objects remain different estimator kinds
Same interface Not equal: AILM’s comparator arms are native in-process decoders (the harness’s letter/phoneme/G2P comparator paths — no prompt, no HTTP, no output format), while every probe arm answers the JSON/temperature-0 HTTP contract. Within the probe side, the fitted and unfitted arms share the interface exactly. Condition five stays non-equal
Resolvable contrasts Declared per arm; the fitted contrasts get their own declared family

Two protocol constants that are not fairness conditions, labeled as such:

The honest summary: P1 equalizes supervision and fitting opportunity; interface, capacity, prior exposure, and the measure-the-named-ability condition remain failed exactly as the supplement records them. No claim is made that every fairness condition is now satisfied — the fourth condition moves from “holds nowhere” to “holds in this arm, with declared residuals”, and the comparison remains a reference frame, not a competitiveness claim.

2.5 Separation, freeze, and measurement order

  1. Freeze evaluation first: positions, prompts, parser, scorer are already frozen constants; record their digests in the run receipt.
  2. Build fit artifacts (train-only instances, schema below); record sha256
    • provenance (raw-source identity, generator path, seed) before any fit.
  3. Select hyperparameters (rank, iters, learning rate, batch) on an inner-train validation split carved from the train material (the contiguous diagnostic tail and seam defined in §2.2, disjoint from fitting instances); never read a scored population during selection.
  4. Fit and freeze: adapter digest, config digest, loss curve, and the exact trainer command recorded.
  5. Fuse, convert, quantize, serve: fused GGUF digest; ollama create tag; resolved_model_identity digest recorded before any scored call.
  6. Score once, in declared order: the unfitted-upstream control arm first, then the fitted arm, interleaved under a declared arm-order policy (the alternating-full-short-by-position-v1 pattern); one uncached warm-up per model per arm before scoring; repeat trials under a fresh run scope with the existing repeat_trial_protocols machinery.
  7. Record under the new namespace with the same wholesale-replacement, single-writer-lock, refuse-partial-run discipline as scripts/record_external_benchmark_claims.py; bind receipts through scripts/verify_network_claim_bindings.py.

2.6 Controls (gate liveness, leakage, lineage, legitimate outcomes)

The project’s own rule: no gate without a live positive and negative control (GateVacuousError discipline in ../docs/gate_design.md and testing_philosophy.md). P1’s controls, with tolerances, seeds, and margins fixed before fitting:

Failure criteria for the protocol as a whole — blocks only: a C4 leakage-guard failure; a response-contract or receipt failure; the backend unavailable on the target architecture; C1 no-lift without the saturation diagnosis. Reportable, non-blocking outcomes (all recorded, never filtered post hoc): supervision-attributed lift; no-lift with saturation; marginal/ format learning (C1 lift at or below the C2 floor); fitted arm at or below unfitted on the scored positions after C1 resolved — the Stage 2 lesson that a fitting arm can fail the bar it was built for.

2.7 Expected files, dependencies, feasibility (estimates)

Original proposed file layout (not a current module inventory). The implemented foundation is indexed in its package README; this table preserves the proposed remaining trainer/export boundaries:

Proposed file Owns
src/ailm/benchmarks/fitted/__init__.py Package surface, registry access (mirrors the package’s lazy re-export discipline)
src/ailm/benchmarks/fitted/identity.py Upstream pin, adapter/merge/quantization digests, and the separate FITTED_PROBES registry with its own validator
src/ailm/benchmarks/fitted/data.py SFT artifact builders (train-side only), digests, leakage-guard hooks
src/ailm/benchmarks/fitted/driver.py Trainer invocation (declarative config, recorded command), validation split, freeze checks
src/ailm/benchmarks/fitted/export.py Fuse → convert → quantize → local ollama create, digest binding
scripts/generate_fitted_probe_data.py Writes the vendored SFT artifacts under the provenance discipline
scripts/record_fitted_probe_claims.py The recorder: wholesale namespace, single-writer lock, receipts, refused partial runs
tests/test_fitted_probe_protocol.py Offline tests: registry coherence, digest checks, C1/C2 logic on fixtures, no-network invariant

The import contract is respected: the new package touches the probe side only, imports no pymdp, and adds nothing to any level build or gate (architecture.md — the probe package is already outside the pymdp stack by design).

Original proposed fitting dependencies. Availability and versions must be verified in the separate trainer environment before use; this historical list is not a claim about the current AILM virtualenv:

Feasibility — estimates, explicitly not measured: the machine is a Mac with the hw.memsize recorded in this session’s inventory (twenty-four gibibytes of unified memory). The SmolLM 1.7B bf16 checkpoint’s full-precision footprint is card-reported at 3422.76 MB (inline, model-card fact); the qwen2 3B checkpoint is roughly twice that by parameter count (estimate); both LoRA fits are expected to sit comfortably inside unified memory with the official trainer’s documented memory controls (--batch-size, --num-layers, --grad-checkpoint, --grad-accumulation-steps). Disk space is ample (the drive reports large free capacity). No wall-clock, token-throughput, or cost estimate is claimed anywhere; the protocol instead fixes a declared optimization budget before fitting and records the trainer’s own loss telemetry as the receipt.

2.8 External authorization and resource requirements

Distinguished honestly, per the milestone instruction not to invent authorization theater for routine public fetches:

2.9 Success and failure criteria

2.10 Ordered implementation partitions (ownership boundaries)

# Partition Grant needed Test/failure criterion
0 Fit-artifact generators + identity module + offline tests (no model calls, no network) source/tests Implemented and fixture-tested in this tree (E1R2: src/ailm/benchmarks/fitted/ identity/census/data/receipt + thin CLI); digest-stable regeneration; C4 structural tests pass offline
1 SmolLM letter fit end-to-end (fit, fuse, convert, serve, score, record) network fetch (public), local serving, training, recorder Prerequisites in order: measured warm-up throughput pilot + checkpoint/resume resource gate (§2.2), then controls per §2.6; receipt verifies; ledger namespace complete or the run refuses. Full-corpus stream preparation runs under its own scheduled handoff
2 Phoneme + G2P fits on the same skeleton same Same, per task
3 Qwen arm (qwen2 export path via llama.cpp) same Same
4 Gemma arm only with the gated-license acceptance resolved Same; blocked until then
5 Manuscript/supplement integration manuscript grant Not in this milestone

Serialization boundary: the fitted registry’s frozen contracts, the recorder receipt schema, and (for P2) the synthetic protocol registry are shared surfaces — one writer per change, per the benchmarks package’s ownership table. SERVED_PROBES and every historical namespace are outside this protocol’s write surface.


3. Protocol P2 — stipulated aligned spelling-to-pronunciation (design B)

A pair-structured stipulated artifact, structurally distinct from the shipped order-one continuation chains (evidence: the existing arms are single-symbol next-symbol tasks over a bigram chain — src/ailm/levels/synthetic.py, its two SYNTHETIC_*_CHAIN_VERSION constants, and the flat bigram-count artifacts vendor/synthetic_counts.json / vendor/synthetic_phone_counts.json; the pairwise generator and aligned artifact were absent when this protocol was drafted; they now exist under the P2 implementation described above).

3.1 The stipulated correspondence and population

3.2 Artifact schema (proposed)

vendor/synthetic_aligned_g2p_counts.json (schema name proposed ailm-synthetic-aligned-g2p-v1), written by a new scripts/generate_synthetic_aligned_g2p.py:

schema, provenance {
  chain_version, correspondence_version, corpus_seed, held_out_seed,
  word_length_L, resample_attempts_cap,
  generator_path, letter_inventory_source, phone_inventory_source,
  train_words_digest, test_words_digest, correspondence_table_digest
},
correspondence {letter -> phone, complete over the letter inventory},
splits {train: [(spelling, phone_string)], test: [(spelling, phone_string)]}

Registered in provenance/sources.md with its sha256 and enforced by tests/test_provenance_checksums.py, exactly like the two existing synthetic artifacts (32b00fa2… and 319b3926… are the current precedents recorded there).

3.3 Fit/evaluation boundaries and the adversarial checks

The design-B erratum (artifact locator: output/reports/omp-dispatch-20260908/evidence/scholar-S2-primary-evidence/ERRATUM-S2.md) withdrew Design B’s “generator-owned, so no labels exist to leak” reasoning as too strong: generator ownership does not certify absence of leakage or of unknown pretraining exposure (src/ailm/levels/synthetic.py’s own docstring says the same for the whole stipulated family). The checks below are therefore structural. Closure statement: completing this protocol — artifact, comparator controls, and the recorded evaluation — can close the TODO’s aligned-pronunciation design item; unknown pretraining exposure remains the standing limitation of the stipulated family, and the artifact is never called contamination-free.

3.4 Arms, protocol, claims

3.5 Success/failure and cost

Success: stipulated-alignment comparator clears A1–A3 on identical positions (mechanism works under a true correspondence); probe arms reported descriptively under declared families. Failure: any refusal fires, or the comparator fails under the condition it was built for — reported, not repaired. Cost: one generator + one artifact + recorder arm (offline); probe arms need the Ollama slot under existing discipline. No new network machinery.


4. Protocol P3 — the L4→L3 P(word | case role) bridge account

The TODO is explicit that the map is not fittable from any shipped artifact and that a word-form extension needs an explicit label-construction / split / observation account before anything is built. This section builds that account as it stood before implementation. The artifact, executor and influence sweep subsequently landed; this section preserves their declared rationale and must not be read as today’s implementation inventory.

4.1 The gap, stated from the shipped artifacts

4.2 The account (what the TODO requires before any artifact)

  1. Label provenance, per token. Every token row of the proposed artifact carries (word_form, upos, case_label_or_null, label_source) where label_source ∈ CASE_ORACLE_PATHS (src/ailm/corpus/ud.py:76): morphology (from feats[Case]), deprel (src/ailm/cases.py::UD_DEPREL_TO_CASE), or adposition_token (src/ailm/cases.py::ADPOSITION_TO_CASE, labeling the adposition token itself — no head-transfer rule, per ../src/ailm/corpus/AGENTS.md). Assignment reuses src/ailm/corpus/ud.py::case_oracle_assignment unchanged. Derived labels remain agreement, not accuracy wherever quoted.
  2. Split. The same document-stride split construction as the existing case artifact (test_every = 5 over authenticated newdoc ids, dev corpus only), with the new artifact’s split_indices cross-validated against vendor/ud_ewt_case_counts.json’s recorded split so the populations are the same documents. The resulting artifact is therefore the same development population in a new representation: those dev documents were already scored as Stage 4 case-assignment populations, so any new result on them is development evidence under a fresh registration — never confirmatory, never “untouched”. The shared corpus’s test file remains untouched and spent (decision 111).
  3. Model-observation account. The L4 model’s observation is unchanged — UPOS only (src/ailm/levels/case.py::FORBIDDEN_OBSERVATIONS, frozenset({"deprel", "feats", "case"})). The oracle case labels are sender-side inputs for fitting only, recorded per token with label_source, and structurally unavailable to any model observation (the artifact’s observation provenance string states this, and the loader refuses an artifact that drops it — the pattern the existing case artifact already enforces at scripts/generate_case_counts.py).
  4. The estimand and the executable seam (model-sender). The bridge’s message is built from K(word | role) — a role-conditioned word distribution fitted only from the declared training oracle-label routes (train rows, label_source recorded per token). At runtime, for a receiver state whose L4 observation is UPOS u, the message is the posterior marginalization M(u) = Σ_role q_L4(role | u) · K(word | role), where q_L4(role | u) is the case level’s own inferred role posterior given the observed UPOS. Its exact form is a named constant fixed at P3 partition-3 finalization, coordinated with the P3 builder: a static per-UPOS Bayes inversion of the learned emission, or the sequential filtered posterior read from the live L4 filter — one is chosen and recorded in the registry entry; the account here does not depend on which. This runtime marginalization is legitimate and is explicitly distinct from fitting K on predicted roles (the rejected different estimand P(word | predicted role) — the design-C substitution; erratum locator as in §3.3). The message is consumed by an explicit new L3 inlet/executor — a new seam that reads the L4 posterior marginal; no shipped channel reads any case posterior today, and the registry entry below is registration-only structure, never narrated as an executed cascade. A privileged-oracle arm — the token’s oracle role selecting K(word | role) directly at runtime — is a separately labeled diagnostic arm only, never the bridge estimand.
  5. Forbidden predictors, restated structurally. No deprel/feats[Case] observation to any model level (guard above, plus the new artifact simply does not carry those fields as observables); the target word never conditions the role posterior (the case level’s input space is unchanged); the message flows role→word, never word→role.
  6. Vocabulary intersection, mixing math, zero-support and no-message policies. Sender corpus = UD EWT dev; receiver vocabulary = the Stage 3 default vocabulary, fixed at two thousand types (principal’s decision — not to be raised). Normalization rule (declared, not post-hoc): EWT word forms are lowercased and matched by exact string against the Stage 3 vocabulary’s lowercase type keys (from vendor/brown_word_counts.json); no other folding or stemming. The message’s support is the intersection. Mixing math, stated exactly: mix_prior (src/ailm/levels/clause_channel.py:529) computes (1−α)·prior + α·message without renormalization. With zero message mass at out-of-intersection indices, every α > 0 shrinks the prior at those indices by exactly (1−α) (e.g., prior 0.28 at α=0.2 becomes 0.224) while intersection words are boosted; the total stays one. This per-token effective-α heterogeneity is part of the declared intervention — the message cannot speak about words it has no data for — and policy (i), zero message mass outside the intersection, is adopted with that corrected reading (the earlier “receiver prior unchanged” claim was false and is withdrawn). The executor adds a normalization assertion at the seam: a message whose masses do not sum to one is refused (mix_prior today accepts one silently). Zero-support policy: roles with no training words are excluded from the marginalization and q_L4 renormalized over the supported roles; if no role has support for an observed UPOS, the no-message case fires with the deterministic policy D_α = D_0 (skip the insertion) — never an unnormalized distribution. Cross-corpus transfer (an EWT-estimated message applied to a Brown-receiver population) is part of the declared estimand, named as such, not hidden.
  7. Reuse, not re-derivation, of the shipped machinery. The convex mixing with the bit-identical alpha=0 anchor, the sweep grid guard, the word-axis scrambled negative control, and the document-clustered paired summary are src/ailm/levels/clause_channel.py::mix_prior, ::sweep_clause_alpha, ::scramble_word_distribution, and ::clustered_clause_word_summaries respectively — used as-is. Two new registry identities, both additive entries in src/ailm/channel_registry.py, neither a new model level nor a clause-channel edit: the model-sender bridge entry (registration-only structure; a model-level sender cannot claim PRIVILEGED_ORACLE — channel_registry.py:130-131 refuses it) and a separately labeled diagnostic entry for the privileged-oracle arm (sender “case-oracle (train routes, dev)”, receiver L3, insertion word prior D, comprehension_only). K pools the declared routes on train rows; the artifact reports per-route coverage (only NOM/ACC/GEN have a morphology route; the deprel and adposition routes are derived — their agreement is agreement, not accuracy) and per-route agreement with the pooled label, so the pooling is a declared, inspectable choice. A Brown-side sender alternative exists (EWT-derived build_upos_lexicon tag projection over Brown forms) but adds an uncontrolled tag-quality layer and changes the estimand to a lexicon-projected one; it is listed under decisions, not adopted.

4.3 The three-layer separation the TODO demands

4.4 Artifact schema sketch (proposed, not built)

schema "ailm-case-word-counts-v1" (proposed)
provenance {
  corpus "UD English EWT dev (en_ewt-ud-dev.conllu)", license "CC BY-SA 4.0",
  source_revision, source_sha256, source_size_bytes,
  observation "UPOS only for any model observation; oracle case labels are
               sender-side fitting inputs, recorded per token with
               label_source",
  split "document-index stride over authenticated # newdoc id values (dev)",
  test_every, document_identity_sha256
}
populations { train | test } rows: [word_form, upos, case_label_or_null,
                                    label_source]
sender_map  { role -> {word_form: count} }   (train rows only; per-route
             coverage and per-route agreement fields alongside)
vocab       mapping to the Stage 3 receiver vocabulary
digests     {populations, sender_map, vocabulary}

4.5 Implementation partitions and decisions

# Partition Ownership boundary Criterion
1 scripts/generate_case_word_counts.py + artifact + offline tests new files only; vendor/ provenance entry Byte-stable regeneration; observation string enforced; per-route coverage/agreement fields present; no test bytes read
2 Registry identities + registry-level structural path test additive entries in channel_registry.py; no level edits Model-sender entry and separately labeled oracle-diagnostic entry both type-correct; comprehension-only
3 L3 inlet/executor + message builder + alpha sweep recorder (exploratory status by default) new executor module; reuses clause_channel.py unchanged Normalization assertion at the seam; zero-support and no-message policies enforced; anchor identity, scramble + declared positive controls live; clustered summary declared

Resolved as proposed (rationale inline above): sender = model-sender K fitted from train routes, runtime message = q_L4 marginalization (oracle sender = diagnostic arm only); OOV = zero message mass with the corrected shrink semantics declared; no-message = deterministic D_α = D_0; vocabulary normalization = lowercase exact-string match. Execution-ordering items, not approval gates: the influence sweep registers only after partitions 1–2 land and its estimand registration is written; the posterior-constant choice (§4.2 item 4) is fixed with the P3 builder at partition-3 finalization.


5. Ownership, grant boundaries, and what this milestone did not do

At the original drafting milestone, the written scope was this file and its index row in README.md. Subsequent implementation and measurement were assigned separately. The partition table records those boundaries; it is not a new approval requirement for work already authorized in the active session. No Git writes, no stashes, no environment mutation, no production recorder run, no training or download occurred. The dirty main work at 01b868b is untouched.

Faithful vs unresolved, per original TODO item:

Item Covered here (faithfully) Still unresolved
Equal opportunity to fit A complete, source-grounded fit protocol over the registered probe lineages with equalization statements, controls, separation, and partitions; the identity/data foundation is implemented and fixture-tested (E1R2) The fit itself, the FITTED_PROBES registry population and consumers, any measurement; the gemma3 gated-license question
Aligned pronunciation A pair-structured stipulated design with leakage/adversarial checks that never claim contamination-freedom The generator, artifact, recorder arm, any optional probe arm — the generator and committed artifact ship, and the offline evaluator runs the three controls; offline and zero-shot probe arms have recorded evidence; new optional arms remain separately specified work
L4→L3 bridge The full label/split/observation account built before an artifact, with the model-sender estimand (K from train routes, q_L4 marginalization at runtime), corrected mixing math, and the dev population declared development evidence in a new representation The artifact, the registry entries, the L3 inlet/executor — all ship; the registered development influence sweep is recorded under decision 121; the connected runtime and GUM comparison are separate evidence

The three Principal-decision TODO items (inline rationale, declarations, main-text split) are explicitly out of scope here and remain the author’s.

6. Verification performed for this document (read-only)