diff --git a/docs/design/iter-slm254-lot3-01-not-authorized-20260725.json b/docs/design/iter-slm254-lot3-01-not-authorized-20260725.json new file mode 100644 index 000000000..4198f31f2 --- /dev/null +++ b/docs/design/iter-slm254-lot3-01-not-authorized-20260725.json @@ -0,0 +1,26 @@ +{ + "contract_hash": "99053bd6cd87993e05a2d3585b94b382a51e21183a25dad2b31d286da0cbea73", + "contract_id": "causal-latent-use-gate-v1", + "issue": { + "activation_requirement": "SLM-251 provides a qualified faithful latent checkpoint preserving strict outcomes versus the continued explicit control; SLM-252 selects the routing/timing/grounding contract (or explicitly authorizes a bounded causal study); SLM-253 selects the readout contract and target factors; and a gold/oracle trace substitution ceiling is nonzero.", + "alias": "LOT3-01", + "gate_contract_id": "causal-latent-use-gate-v1", + "linear_issue": "SLM-254", + "slug": "lot3-01-causal-latent-use", + "title": "Establish latent-factor availability, necessity, and specificity with causal interventions" + }, + "lot1_01_disposition": "not_authorized", + "lot1_02_disposition": "not_authorized", + "schema_version": "lot_downstream_gate/v1", + "verdict": "not_authorized", + "verdict_rationale": "LOT3-01 (SLM-254) activation requires: SLM-251 provides a qualified faithful latent checkpoint preserving strict outcomes versus the continued explicit control; SLM-252 selects the routing/timing/grounding contract (or explicitly authorizes a bounded causal study); SLM-253 selects the readout contract and target factors; and a gold/oracle trace substitution ceiling is nonzero. The LOT1-02 launch gate reports 'not_authorized' (LOT1-01 disposition 'not_authorized'): no faithful K x c model path, curriculum, Stage 0 parent, or continued-explicit control exists, and SLM-249's oracle ceiling is not positive. Closing not_authorized in plan-only/bounded-diagnostic mode; no training, factorial, intervention, or systems code is added by this disposition.", + "version_stamp": { + "code_commit": "f0c05a941e8a5ddf3fa0c2ee8ad68069497d086f", + "code_dirty": true, + "components": { + "harness.experiments": "v113" + }, + "stamp_schema": "version_stamp/v1", + "stamped_at": "2026-07-25T16:11:10.889626+00:00" + } +} diff --git a/docs/design/iter-slm254-lot3-01-not-authorized-20260725.md b/docs/design/iter-slm254-lot3-01-not-authorized-20260725.md new file mode 100644 index 000000000..f7c51a323 --- /dev/null +++ b/docs/design/iter-slm254-lot3-01-not-authorized-20260725.md @@ -0,0 +1,15 @@ +# SLM-254 LOT3-01 — Downstream-gate disposition (causal-latent-use-gate-v1) + +Verdict: **not_authorized** + +LOT3-01 (SLM-254) activation requires: SLM-251 provides a qualified faithful latent checkpoint preserving strict outcomes versus the continued explicit control; SLM-252 selects the routing/timing/grounding contract (or explicitly authorizes a bounded causal study); SLM-253 selects the readout contract and target factors; and a gold/oracle trace substitution ceiling is nonzero. The LOT1-02 launch gate reports 'not_authorized' (LOT1-01 disposition 'not_authorized'): no faithful K x c model path, curriculum, Stage 0 parent, or continued-explicit control exists, and SLM-249's oracle ceiling is not positive. Closing not_authorized in plan-only/bounded-diagnostic mode; no training, factorial, intervention, or systems code is added by this disposition. + +## Upstream chain + +- LOT1-02 launch gate (SLM-251): `not_authorized` +- LOT1-01 activation gate (SLM-250): `not_authorized` +- Activation requirement: SLM-251 provides a qualified faithful latent checkpoint preserving strict outcomes versus the continued explicit control; SLM-252 selects the routing/timing/grounding contract (or explicitly authorizes a bounded causal study); SLM-253 selects the readout contract and target factors; and a gold/oracle trace substitution ceiling is nonzero. + +## Non-goals honored + +No training campaign, factorial, readout/decoder, intervention, systems measurement, or production default change. This disposition is itself the deliverable while the upstream activation gate is unmet. diff --git a/src/slm_training/harnesses/experiments/lot_downstream_gate.py b/src/slm_training/harnesses/experiments/lot_downstream_gate.py index 346a36f8f..af1d6b9a7 100644 --- a/src/slm_training/harnesses/experiments/lot_downstream_gate.py +++ b/src/slm_training/harnesses/experiments/lot_downstream_gate.py @@ -91,6 +91,21 @@ def to_dict(self) -> dict[str, Any]: "routing." ), ), + "SLM-254": DownstreamIssueSpec( + linear_issue="SLM-254", + alias="LOT3-01", + title="Establish latent-factor availability, necessity, and specificity with causal interventions", + gate_contract_id="causal-latent-use-gate-v1", + slug="lot3-01-causal-latent-use", + activation_requirement=( + "SLM-251 provides a qualified faithful latent checkpoint " + "preserving strict outcomes versus the continued explicit " + "control; SLM-252 selects the routing/timing/grounding contract " + "(or explicitly authorizes a bounded causal study); SLM-253 " + "selects the readout contract and target factors; and a " + "gold/oracle trace substitution ceiling is nonzero." + ), + ), } diff --git a/src/slm_training/resources/versions.json b/src/slm_training/resources/versions.json index 0c75d2dd9..1263c50e1 100644 --- a/src/slm_training/resources/versions.json +++ b/src/slm_training/resources/versions.json @@ -1912,7 +1912,7 @@ ] }, "harness.experiments": { - "version": "v119", + "version": "v120", "kind": "harness", "paths": [ "scripts/run_slm298_capacity_context_curriculum.py", @@ -1921,6 +1921,11 @@ "tests/test_scripts/test_run_slm298_capacity_context_curriculum.py" ], "history": [ + { + "version": "v120", + "date": "2026-07-25", + "note": "register SLM-254 LOT3-01 in the LOT downstream gate registry; closes not_authorized (causal study not authorized) off the unmet LOT1/LOT2 chain" + }, { "version": "v119", "date": "2026-07-25", @@ -1986,6 +1991,11 @@ "date": "2026-07-25", "note": "add SLM-300 AP-015 self-context exposure-bias curriculum manifest, policy-origin-mixture wiring/fixture harness, and mixture-zero legacy-equivalence invariant" }, + { + "version": "v113", + "date": "2026-07-25", + "note": "register SLM-254 LOT3-01 in the LOT downstream gate registry; closes not_authorized (causal study not authorized) off the unmet LOT1/LOT2 chain" + }, { "version": "v112", "date": "2026-07-25", @@ -9806,13 +9816,15 @@ ] }, "harness.experiments.lot_downstream_gate": { - "version": "v2", + "version": "v3", "kind": "gate", "paths": [ "docs/design/iter-slm252-lot2-01-not-authorized-20260725.json", "docs/design/iter-slm252-lot2-01-not-authorized-20260725.md", "docs/design/iter-slm253-lot2-02-not-authorized-20260725.json", "docs/design/iter-slm253-lot2-02-not-authorized-20260725.md", + "docs/design/iter-slm254-lot3-01-not-authorized-20260725.json", + "docs/design/iter-slm254-lot3-01-not-authorized-20260725.md", "scripts/evaluate_lot_downstream_gate.py", "src/slm_training/harnesses/experiments/lot_downstream_gate.py", "tests/test_harnesses/experiments/test_lot_downstream_gate.py", @@ -9820,9 +9832,14 @@ ], "history": [ { - "version": "v2", + "version": "v3", "date": "2026-07-25", - "note": "add SLM-253 LOT2-02 registry entry + not_authorized iter docs (structured-latent-readout-gate-v1)" + "note": "add SLM-254 LOT3-01 registry entry + not_authorized iter docs (causal-latent-use-gate-v1)" + }, + { + "version": "v3", + "date": "2026-07-25", + "note": "add SLM-254 LOT3-01 registry entry + not_authorized iter docs (causal-latent-use-gate-v1)" }, { "version": "v2", diff --git a/tests/test_harnesses/experiments/test_lot_downstream_gate.py b/tests/test_harnesses/experiments/test_lot_downstream_gate.py index 2ef843a97..2c41bd352 100644 --- a/tests/test_harnesses/experiments/test_lot_downstream_gate.py +++ b/tests/test_harnesses/experiments/test_lot_downstream_gate.py @@ -108,3 +108,16 @@ def test_slm253_real_contracts_are_not_authorized() -> None: assert contract.verdict == NOT_AUTHORIZED assert contract.contract_id == "structured-latent-readout-gate-v1" + + +def test_slm254_real_contracts_are_not_authorized() -> None: + """LOT3-01's own text: if the gates fail, close with + causal_study_not_authorized rather than manufacturing interpretability + evidence. With the LOT1/LOT2 chain unmet there is no faithful latent + checkpoint to intervene on. + """ + fidelity, trace = _real_contracts() + contract = evaluate_downstream_gate(DOWNSTREAM_ISSUES["SLM-254"], fidelity, trace) + + assert contract.verdict == NOT_AUTHORIZED + assert contract.contract_id == "causal-latent-use-gate-v1" diff --git a/tests/test_scripts/test_evaluate_lot_downstream_gate.py b/tests/test_scripts/test_evaluate_lot_downstream_gate.py index b45d7cd30..8f5a63d03 100644 --- a/tests/test_scripts/test_evaluate_lot_downstream_gate.py +++ b/tests/test_scripts/test_evaluate_lot_downstream_gate.py @@ -46,3 +46,12 @@ def test_slm253_run_reports_not_authorized(tmp_path: Path) -> None: data = json.loads((out / "lot2_02_structured_readout_gate.json").read_text()) assert data["verdict"] == "not_authorized" assert data["issue"]["alias"] == "LOT2-02" + + +def test_slm254_run_reports_not_authorized(tmp_path: Path) -> None: + out = tmp_path / "gate254" + rc = evaluate_lot_downstream_gate.main(["--issue", "SLM-254", "--out", str(out)]) + assert rc == 0 + data = json.loads((out / "lot3_01_causal_latent_use_gate.json").read_text()) + assert data["verdict"] == "not_authorized" + assert data["issue"]["alias"] == "LOT3-01"