Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
559 changes: 559 additions & 0 deletions docs/design/var1-02-set-property-action-20260726.json

Large diffs are not rendered by default.

131 changes: 131 additions & 0 deletions docs/design/var1-02-set-property-action-20260726.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
# SLM-299 (LAR1-03): X22 edit-space reachability audit

- generated_at: `2026-07-26T19:32:41Z`
- seed: `root = Stack([], "column")`
- mode: `extended`
- max_edits: 8, node_budget: 15
- verdict policy: reachable_fraction is computed over decided cases only; UNKNOWN_BUDGET cases are reported separately and are never counted as unreachable; suites without a corpus are corpus_unavailable, never zero-reachable. Reachability is a space-coverage proof, never a model-quality claim.

> Reachability is space coverage, not model quality: no quality claim
> follows from these proofs alone.

## SLM-425 production delta

`ACTION_SET_PROPERTY` is now a real format-3 action. It mutates only the
target container's finite, pack-owned `rest` domain and fragment-validates the
structured rebuilt statement. The broader VAR1-01 `row` control remains
hypothetical; it is not production authority.

| suite | SLM-305 baseline | VAR1-01 arm B | SLM-425 production | delta / caveat |
| --- | --- | --- | --- | --- |
| train | 0/6 | unavailable | unavailable | Current frozen train corpus is unavailable; no comparison claimed. |
| smoke | 0/3 | 0/3 | 0/3 | No verdict flips. |
| held_out | 0/5 | 0/5 | 0/5 | No verdict flips. |
| adversarial | 0/4 | 1/2 decided (0.5) | 1/3 decided (0.333333) | `adv_empty_prompt_01` flips `needs_direction_change` → reachable in 2 edits (`ADD`, `SET_PROPERTY`); production is at or below arm B. |
| ood | 0/4 | 0/4 | 0/4 | No verdict flips. |
| rico | 0/6 historical | 35 unknown | 0/1 decided; 34 unknown | No favorable comparison: historical corpus size differs and UNKNOWN_BUDGET is not unreachability evidence. |

This bounded local run used `max_edits=8`, `node_budget=15`, and the full
currently available smoke/held_out/adversarial/ood/rico inputs. It is a
capability-space coverage result only: no quality, ship, promotion, checkpoint,
or meaningful-parse claim follows from it.

## Suite summary

| suite | n | decided | unknown | reachable_fraction | min/med/max edits |
| --- | --- | --- | --- | --- | --- |
| train | corpus_unavailable | — | — | — | — |
| smoke | 3 | 3 | 0 | 0.0 | — |
| held_out | 5 | 5 | 0 | 0.0 | — |
| adversarial | 4 | 3 | 1 | 0.333333 | 2/2/2 |
| ood | 4 | 4 | 0 | 0.0 | — |
| rico | 35 | 1 | 34 | 0.0 | — |

## Reason-code histograms

- **smoke**: `{"unsupported_component": 3}`
- **held_out**: `{"unsupported_component": 5}`
- **adversarial**: `{"budget": 1, "needs_direction_change": 1, "reached": 1, "unsupported_component": 1}`
- **ood**: `{"unsupported_component": 4}`
- **rico**: `{"budget": 34, "needs_direction_change": 1}`

## Action / component coverage (reachable paths)

- **smoke**: actions `{}` components `{}`
- **held_out**: actions `{}` components `{}`
- **adversarial**: actions `{"ADD": 1, "SET_PROPERTY": 1}` components `{"TextContent": 1}`
- **ood**: actions `{}` components `{}`
- **rico**: actions `{}` components `{}`

## Per-case verdicts

- **train**: corpus unavailable
- **smoke**:
- `smoke_hero_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `smoke_button_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `smoke_callout_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- **held_out**:
- `held_out_form_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `held_out_dual_card_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `held_out_input_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `held_out_tabs_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `held_out_settings_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- **adversarial**:
- `adv_empty_prompt_01` PROVEN_REACHABLE (reached, lower_bound=2)
- `adv_dual_card_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `adv_deep_nest_01` UNKNOWN_BUDGET (budget, lower_bound=None)
- `adv_many_buttons_01` PROVEN_UNREACHABLE (needs_direction_change, lower_bound=None)
- **ood**:
- `ood_dashboard_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `ood_gallery_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `ood_modal_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- `ood_auth_01` PROVEN_UNREACHABLE (unsupported_component, lower_bound=None)
- **rico**:
- `rico_eval_test_0` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_1` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_2` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_4` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_8` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_9` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_12` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_17` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_20` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_25` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_34` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_35` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_38` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_40` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_41` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_42` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_47` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_48` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_51` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_53` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_55` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_56` PROVEN_UNREACHABLE (needs_direction_change, lower_bound=None)
- `rico_eval_test_57` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_58` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_59` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_60` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_68` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_69` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_77` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_81` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_91` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_95` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_97` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_99` UNKNOWN_BUDGET (budget, lower_bound=None)
- `rico_eval_test_104` UNKNOWN_BUDGET (budget, lower_bound=None)

## X22 evidence annotations (append-only)

- `docs/design/iter-x22-d3-kapur-tree-edit-20260717.md` [adversarial]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.333333 over 3 decided adversarial cases (1 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on adversarial in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-efs0-04-x22-reproduction-20260717.md` [adversarial]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.333333 over 3 decided adversarial cases (1 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on adversarial in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-x22-d3-kapur-tree-edit-20260717.md` [held_out]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.0 over 5 decided held_out cases (0 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on held_out in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-efs0-04-x22-reproduction-20260717.md` [held_out]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.0 over 5 decided held_out cases (0 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on held_out in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-x22-d3-kapur-tree-edit-20260717.md` [ood]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.0 over 4 decided ood cases (0 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on ood in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-efs0-04-x22-reproduction-20260717.md` [ood]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.0 over 4 decided ood cases (0 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on ood in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-x22-d3-kapur-tree-edit-20260717.md` [rico]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.0 over 1 decided rico cases (34 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on rico in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-efs0-04-x22-reproduction-20260717.md` [rico]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.0 over 1 decided rico cases (34 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on rico in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-x22-d3-kapur-tree-edit-20260717.md` [smoke]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.0 over 3 decided smoke cases (0 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on smoke in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
- `docs/design/iter-efs0-04-x22-reproduction-20260717.md` [smoke]: SLM-299 edit-reachability audit: from the standard X22 minimal seed, reachable_fraction=0.0 over 3 decided smoke cases (0 UNKNOWN_BUDGET, never counted unreachable). Suite-level quality readings of the X22 tree-edit decode on smoke in this document are bounded by that fraction: the unreachable share of gold programs cannot be produced by the decode space at all, so measured quality on those cases reflects space coverage, not model quality.
2 changes: 1 addition & 1 deletion src/slm_training/dsl/variants.py
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ def build_variant_contracts() -> tuple[VariantContractV1, ...]:
pack_id="openui",
action_alphabet_id="tree_edit_diffusion.edit_actions",
action_alphabet_fingerprint=_alphabet_fingerprint(_tree_edit_action_names()),
kernel_ops=(),
kernel_ops=("openui.set_property",),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
rg -nP -C3 'set_property' --type=py -g 'src/slm_training/dsl/**'
rg -n 'openui.set_property' src/slm_training/resources/ops_vocab_registry.json

Repository: Tyler-R-Kendrick/slm-training

Length of output: 248


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Locate the file and inspect around the reported action identity plus nearby variant definitions.
wc -l src/slm_training/dsl/variants.py
sed -n '220,270p' src/slm_training/dsl/variants.py

# Search for the exact new action identity across tracked files relevant to DSL/resources.
rg -n "openui\.set_property|set_property|rest|finite pack|pack-owned|mutat" src/slm_training/dsl src/slm_training/resources --glob '*.py' --glob '*.json' | sed -n '1,200p'

# Locate OPS_VOCAB definition/load path.
rg -n "OPS_VOCAB|ops_vocab_registry|operator registry|set_property" src/slm_training -g '*.py' --glob '*.json' | sed -n '1,200p'

Repository: Tyler-R-Kendrick/slm-training

Length of output: 32927


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect how variants.py validates kernel_ops and how OPS_VOCAB is derived from the registry.
sed -n '70,135p' src/slm_training/dsl/variants.py
sed -n '35,105p' src/slm_training/dsl/ops_vocab.py
sed -n '35,70p' src/slm_training/resources/ops_vocab_registry.json

# Inspect the set_property local operator semantic description and mutation argument usage.
sed -n '1,90p' src/slm_training/dsl/operators/local.py
sed -n '380,605p' src/slm_training/dsl/operators/local.py

# Inspect tree-edit action source description for its realized operation and argument shape.
sed -n '1,140p' src/slm_training/dsl/tree_edit_diffusion.py
sed -n '140,260p' src/slm_training/dsl/tree_edit_diffusion.py

Repository: Tyler-R-Kendrick/slm-training

Length of output: 17305


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "tracked files matching tree_edit:"
git ls-files | rg 'tree_edit|edit_diffusion|edit' | sed -n '1,120p'

echo
echo "search for tree_edit_diffusion and action names"
rg -n "tree_edit_diffusion|_tree_edit_action_names|edit_actions|set_property|component_widen|rest" src/slm_training/dsl src/slm_training/harnesses/experiments src/slm_training/resources --glob '*.py' --glob '*.json' | sed -n '1,240p'

Repository: Tyler-R-Kendrick/slm-training

Length of output: 37848


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "tree_edit_diffusion outlines/snippets"
for f in src/slm_training/models/tree_edit_diffusion.py src/slm_training/dsl/tree_edit_diffusion.py 2>/dev/null; do
  if [ -f "$f" ]; then
    wc -l "$f"
    sed -n '1,180p' "$f"
    printf '\n--- edit_actions/action id mentions in %s ---\n' "$f"
    rg -n "ACTION_|ACTION_*|edit_actions|set_property|rest|component|payload|target" "$f" | sed -n '1,220p'
  else
    echo "missing: ${f}"
  fi
done

echo
echo "tree edit action references in sources/tests"
rg -n '_tree_edit_action_names|tree_edit_diffusion\.edit_actions|edit_actions|ACTION_[A-Z]+|SET_PROPERTY|rest|container_rests|payload' src/slm_training src/tests tests tests/test_models --glob '*.py' | sed -n '1,260p'

Repository: Tyler-R-Kendrick/slm-training

Length of output: 258


🏁 Script executed:

#!/bin/bash
set -u

echo "tree_edit_diffusion outlines/snippets"
for f in src/slm_training/models/tree_edit_diffusion.py src/slm_training/dsl/tree_edit_diffusion.py; do
  if [ -f "$f" ]; then
    wc -l "$f"
    sed -n '1,180p' "$f"
    printf '\n--- edit_actions/action id mentions in %s ---\n' "$f"
    rg -n "ACTION_|ACTION_.*|edit_actions|set_property|rest|component|payload|target" "$f" | sed -n '1,220p'
  else
    echo "missing: ${f}"
  fi
done

echo
echo "tree edit action references in sources/tests"
rg -n '_tree_edit_action_names|tree_edit_diffusion\.edit_actions|edit_actions|ACTION_[A-Z]+|SET_PROPERTY|rest|container_rests|payload' src/slm_training src/tests tests --glob '*.py' | sed -n '1,280p'

Repository: Tyler-R-Kendrick/slm-training

Length of output: 50385


Use a rest-mutation op identity, not openui.set_property.

tree_edit_diffusion only declares ACTION_SET_PROPERTY for this action, while the registry/operator declaration for openui.set_property is a single node.role.value AST property edit. Claiming that as the tree-edit kernel op masks a broader pack-owned rest action; add/register a narrower rest-edition op name and contract instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/slm_training/dsl/variants.py` at line 250, Update the tree-edit variant’s
kernel_ops declaration to use a dedicated rest-mutation operation identity
instead of openui.set_property. Add or register the narrower rest-edition
operator and its contract, then reference that new symbol in the relevant
variant while preserving ACTION_SET_PROPERTY for tree_edit_diffusion.

seed_policy_id="tree_edit_diffusion.minimal_valid_program_seed",
inventory_source="pack",
source_path=_TREE_EDIT_DIFFUSION_SOURCE,
Expand Down
62 changes: 51 additions & 11 deletions src/slm_training/harnesses/experiments/slm299_edit_reachability.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
ACTION_REPLACE,
ACTION_REPLACE_STATEMENT,
ACTION_REPLACE_SUBTREE,
ACTION_SET_PROPERTY,
MAX_SLOTS,
Edit,
Statement,
Expand Down Expand Up @@ -380,13 +381,14 @@ def _check_invariants(

v1 space: REPLACE preserves container-ness, arity, and the container's
enum/direction arg; ADD creates leaves only and binds only inventory
slots; REMOVE deletes leaves only. Extended (SLM-305) space: ADD_CONTAINER
slots; REMOVE deletes leaves only. Extended (SLM-425) space: ADD_CONTAINER
/ INSERT_SUBTREE mint containers carrying one of ``CONTAINER_RESTS`` and
bind only inventory slots, REPLACE_SUBTREE / BIND_PLACEHOLDER rebind
leaves only to
inventory slots, and the V0.5 statement actions mint only canonical
templates — the invariant reasons fire only when the corresponding REAL
action of the analyzed mode is absent.
templates. ``ACTION_SET_PROPERTY`` (SLM-425) mutates a declared
pack-owned container property, root included; target rests outside that
finite domain remain an exact impossibility proof.
"""
seed_containers = [s for s in seed if s.has_list]
target_containers = [s for s in target if s.has_list]
Expand Down Expand Up @@ -431,17 +433,27 @@ def _check_invariants(
if normalized not in inventory:
return REASON_NEEDS_SLOT_REBIND

# REPLACE preserves the container's raw enum/direction arg text (rest);
# no real action edits it. Containers minted by the container-creating
# actions carry exactly one of CONTAINER_RESTS. Every target container
# rest must therefore be a seed rest or (with container_add) a candidate
# mint rest; without any container-creating action the multisets must
# match exactly.
# The VAR1-01 synthetic what-if may alter any parser-legal rest. The real
# SLM-425 action is deliberately narrower: every target rest must appear
# in that target component's declared pack domain.
if "set_property" in capabilities:
# A rest-mutation action can produce any target rest on any
# container, root included -- skip both rest checks below entirely.
return None

if extended:
for stmt in target_containers:
rest_domains = [
space.property_values(stmt.comp, property_index)
for property_index, property_name in enumerate(
space.property_names(stmt.comp)
)
if property_name == "rest"
]
if not any(stmt.rest in values for values in rest_domains):
return REASON_NEEDS_DIRECTION_CHANGE
return None

seed_rests = sorted(s.rest for s in seed_containers)
target_rests = sorted(s.rest for s in target_containers)
# Root can never be removed or re-minted, and REPLACE preserves rest:
Expand Down Expand Up @@ -473,8 +485,9 @@ def _enumerate_children(
"""All one-edit successors under the REAL action set of ``mode``, applied
through ``TreeEditSpace.apply`` so preconditions and parser re-validation
are the deployed ones by construction. ``v1`` enumerates the original
REPLACE/ADD/REMOVE set; ``extended`` (SLM-305) adds the container,
subtree, V0.5-statement, and placeholder-binding actions. Deterministic:
REPLACE/ADD/REMOVE set; ``extended`` (SLM-425) adds the container,
subtree, V0.5-statement, placeholder-binding, and property actions.
Deterministic:
same state and mode always yield the same enumeration order.

``visited`` (canonical-key set) is a pure search-efficiency hook: states
Expand Down Expand Up @@ -539,6 +552,33 @@ def _replace_subtree_ok(stmt: Statement) -> bool:
continue
# SLM-305 extended real actions.
if stmt.has_list:
for property_index, property_name in enumerate(space.property_names(stmt.comp)):
if property_name != "rest":
continue
for value_index, value in enumerate(
space.property_values(stmt.comp, property_index)
):
if value == stmt.rest:
continue
edit = Edit(
ACTION_SET_PROPERTY,
stmt_idx,
comp=property_index,
target=value_index,
)
nxt = space.apply(statements, edit, inventory, pre)
if nxt is not None:
children.append(
(
nxt,
{
"action": "SET_PROPERTY",
"stmt": stmt_idx,
"property": property_name,
"rest": value,
},
)
)
for comp_idx in container_comp_idxs:
for rest_idx in range(len(space.container_rests)):
edit = Edit(ACTION_ADD_CONTAINER, stmt_idx, comp_idx,
Expand Down
12 changes: 6 additions & 6 deletions src/slm_training/models/checkpoint_migrate.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,13 +301,13 @@ def migrate_tree_edit_checkpoint(
output_checkpoint: Path | str,
device: str = "cpu",
) -> dict:
"""Warm-start a tree-edit-diffusion format-1 checkpoint to format 2.
"""Warm-start an older tree-edit checkpoint to the current format.

SLM-305 grew ``action_head`` from 4 to ``N_ACTIONS`` rows (extended edit
language). All same-shape tensors are copied verbatim; the old action-head
rows are preserved in the first rows of the new head and the new action
rows stay randomly initialized. A ``.migrate.json`` report is written next
to the output checkpoint.
SLM-425 grows ``action_head`` from format 2's 11 rows to ``N_ACTIONS`` and
introduces a property-value head. Same-shape tensors are copied verbatim;
the old action rows are copied into the prefix and newly introduced rows
and heads keep their initialized values. A ``.migrate.json`` report is
written next to the output checkpoint.
"""
from slm_training.models.tree_edit_diffusion import (
TreeEditDiffusionConfig,
Expand Down
Loading
Loading