Qwen3.5-4B Context-Local Jacobian Clamp
The one idea you need
A prompt writes a chosen word early ("Selected key: apple"), then a later line looks up that word's digit. Editing the early word is like changing a kitchen order slip so a different dish gets cooked; editing the final answer only rewrites the receipt.
The question
If you reach into a small model's memory and swap the trace of the word it picked earlier, does the separate answer it computes later follow the swap?
What we found
Yes, but only when the edit lands on the earlier token that first stores the word. There the model looked up the swapped word's digit on all 48 fresh puzzles, up from zero without the edit, and a wrong-word swap produced that wrong word's own digit, not noise. Yet one of 96 control rows slipped past a precision limit, voiding the formal claim.
Why it matters
When steering a small model by editing its internals, edit the token that holds the concept, not the output position: a late edit rewrites only the next word while downstream steps keep using the original. And verify controls survive low-precision rounding.
On this page
Results at a glance 3
How to read
Six edit types run along the bottom: full state copy, the concept edit, a two-direction concept edit, a wrong-word edit, an output-only edit, and random noise. Paired bars give the share of 48 puzzles hitting the target word and target digit; taller is stronger steering.
Takeaway → The concept edit hits 100% on both bars, matching a full state copy, while the output-only and random edits stay flat at zero: real steering, not disruption.
Data table
| intervention | direct key target rate | mapped digit target rate |
|---|---|---|
| full donor | 100% | 100% |
| all-24 J | 100% | 100% |
| pair J | 100% | 97.9% |
| wrong-donor J | 0% | 0% |
| logit lens | 0% | 0% |
| random | 0% | 0% |
Numbers from experiments/qwen35_4b_context_local_jacobian_clamp/analysis/metrics.json
Technical framing
Target-answer rate on untouched confirmation mappings — Forty-eight untouched mappings at frozen band 4–8. The wrong-donor arm produced its own key/digit on 48/48, not the registered target. Formal verdict remains INVALID_CONTROL because one of 96 random rows missed the exact realized-norm tolerance.
How to read
For an untouched baseline and five edits, paired bars show the confidence gap favoring the new answer over the original, for the reported word and the computed digit. Above zero favors the new answer, below favors the original; higher is a stronger flip.
Takeaway → The concept edit swings both gaps from about minus-twelve and minus-nine up to about plus-eleven and plus-nine, nearly matching a full copy, while output-only and random edits stay pinned negative.
Data table
| intervention | direct key margin | mapped digit margin |
|---|---|---|
| baseline | -11.9 | -9.19 |
| full donor | 12 | 9.41 |
| all-24 J | 11.2 | 8.55 |
| pair J | 10.8 | 8.12 |
| logit lens | -11.8 | -9.19 |
| random | -11.9 | -9.21 |
Numbers from experiments/qwen35_4b_context_local_jacobian_clamp/analysis/metrics.json
Technical framing
Mean target-minus-source logit margin — Positive values favor the target; negative values favor the source. The J clamp crosses both decision boundaries while logit-lens and random controls remain at baseline.
How to read
The bottom axis is how deep the full copy is applied, early layers on the left to late on the right. Three lines track how often it redirected the reported word, the computed digit, and a wrong word's own digit. Higher means the edit still took hold.
Takeaway → All three lines hold at 100% through the early and middle layers, then collapse to zero around layer twenty, where downstream computation has already read the concept.
Data table
| band start layer | direct key target rate | mapped digit target rate | wrong donor's own mapped digit |
|---|---|---|---|
| 4 | 100% | 100% | 100% |
| 8 | 100% | 100% | 100% |
| 12 | 100% | 100% | 100% |
| 16 | 100% | 100% | 100% |
| 20 | 4.2% | 0% | 0% |
| 24 | 0% | 0% | 0% |
Numbers from experiments/qwen35_4b_context_local_jacobian_clamp/analysis/metrics.json
Technical framing
Full-donor causal transport by five-layer band — Selection-only full-state positive control, 24 items per band. Bands are start through start+4. Earliest registered passing band 4–8 was frozen before J confirmation.
In the author’s words from the Overview · “Results”
On 48 untouched confirmation items, the all-24 J clamp changed both the direct key and mapped digit on 48/48. The two-coordinate J clamp changed the mapped digit on 47/48. Wrong-donor J clamps changed 48/48 to the wrong donor's own key/digit, while concept logit-lens clamps and span-orthogonal random controls changed 0/48. The paired J-minus-random consequence difference was +1.00 with bootstrap 95% interval [1.00, 1.00]. Parsing remained 100%. Formal failure: one consequence random-control row had realized-norm relative error 1.155e-5 versus the frozen 1e-5 maximum. Requested controls were orthogonal to numerical precision, but bf16 application left as much as 5.7% of one realized random delta in the J span. Neither defect is rounded away. … Read the full result →
Overview
This is the mechanism-correcting follow-up to qwen35_4b_jacobian_value_transport. It asks whether a concept edit at the earlier token that represents the selected key can change a separately computed consequence. The intervention is a fixed set-to-donor clamp, not a repeated pairwise swap at the answer position.
Research Program
- Primary:
interpretability_and_diagnostics - Conditional secondary programs:
structured_execution_and_compilersandtest_time_reasoning_budgetonly if the consequence gate passes. - Closest near-duplicate:
qwen35_4b_jacobian_value_transport, whose averaged last-position coordinate changed 18/24 direct concept reports but 0/24 mapped consequences. - Prior anchors: C19/C20/C30 (decodable, inert under ActAdd, usable when externalized), C51/C52 (actionability and intervention-locality firewalls).
Question
When a prompt explicitly names a selected key and later asks for a fresh key-to-digit lookup, can a token-Jacobian coordinate clamp at that selected-key position make Qwen3.5-4B compute the counterfactual key's digit? Or do these directions remain token-output controls even when applied at a causal antecedent?
Hypothesis
The first experiment patched the final prediction position, where a late token-aligned direction can control the imminent word without representing a state that downstream computation reads. Here, each direction is fitted as the pullback from a future direct concept report to the earlier selected-key token. At evaluation time, the source prompt is clamped toward clean activations from an otherwise identical target-key donor prompt across a fixed layer band.
If the coordinate is a reusable concept state, the mapped digit should change even though no digit direction or answer gradient enters the intervention. If only the direct key report changes, local writability still does not imply semantic transport.
Setup
- Model: only
Qwen/Qwen3.5-4B, revision851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a, bf16 Transformers inference, cache disabled. - Substrate: fresh prompt-local tables mapping eight one-token concepts to eight distinct one-token digits. Every source, target, and wrong-donor digit differs.
- Splits: 48 separate lens-fit prompts, 24 band-selection items, and 48 untouched confirmation items. No benchmark content is read or used.
- Causal site: the final occurrence of the concept token on the
Selected key:line, before either the direct-report or mapped-consequence suffix. - Primary intervention: replace all 24 targeted J coordinates at that site with the clean target-donor coordinates at every layer in the selected five-layer band, with alpha fixed at 1.
- Band selection: full-activation donor patch only, on the selection split; J-clamp results cannot select the band.
- Primary controls: untouched source, full donor activation, exact per-item and per-layer norm-matched random vectors orthogonal to the J dictionary, wrong donor, two-coordinate clamp, and logit-lens coordinate clamp.
- Primary metric: target-digit rate on the untouched mapped-consequence split. Direct target-key rate is a required mechanism check, not the endpoint.
- Oracle boundary: target donors, target identities, and all causal patches are oracle-only mechanism evidence. They cannot establish a deployable capability.
- Forbidden leakage: the target digit and its output-margin gradient cannot construct, scale, select, or gate the primary J intervention.
Frozen thresholds and the decision tree are in reports/preregistration.md. The pre-run adversarial review is in reports/design_review.md.
Run
CPU smoke and unit tests:
.venv/bin/python -m pytest experiments/qwen35_4b_context_local_jacobian_clamp/tests -q
.venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage smokeScientific stages are restartable and refuse to cross a failed gate:
.venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage model-smoke
.venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage fit-lens
.venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage donor-gate
.venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage confirmationResults
Frozen terminal verdict: INVALID_CONTROL. The scientific signal was otherwise perfect, but one of 96 random-control rows missed the preregistered per-item/layer realized-norm tolerance, so this experiment cannot claim J_TRANSPORT.
- The full-activation donor gate selected the earliest band 4–8. Target donors changed both direct key and mapped digit on 24/24 selection items; wrong donors changed 24/24 to their own key/digit. Four early bands passed; two late bands failed.
- On 48 untouched confirmation items, the all-24 J clamp changed both the direct key and mapped digit on 48/48. The two-coordinate J clamp changed the mapped digit on 47/48.
- Wrong-donor J clamps changed 48/48 to the wrong donor's own key/digit, while concept logit-lens clamps and span-orthogonal random controls changed 0/48.
- The paired J-minus-random consequence difference was +1.00 with bootstrap 95% interval [1.00, 1.00]. Parsing remained 100%.
- Formal failure: one consequence random-control row had realized-norm relative error 1.155e-5 versus the frozen 1e-5 maximum. Requested controls were orthogonal to numerical precision, but bf16 application left as much as 5.7% of one realized random delta in the J span. Neither defect is rounded away.
See reports/report.md and analysis/summary.md.
Interpretation
The parent experiment's late answer-position coordinate looked motor-like. The new early selected-token clamp instead exhibits the registered signature of a semantic state: it transports through a fresh arbitrary mapping, a wrong donor produces its own consequence, a logit lens is inert, and a two-coordinate clamp nearly saturates. This is high-priority evidence, not a valid positive claim, because the exact random-control contract failed. A separate fresh replication must enforce both realized norm and realized span orthogonality before any native-thinking continuation.
Knowledgebase Update
- Program evidence: update with the invalid-but-high-priority result after it is synchronized to
origin/main. - Program backlog: replicate with a quantization-aware realized-orthogonal control on fresh mappings before native-thinking work.
- Claim ledger: remain unclaimed while the repository-wide re-grade is open.
Artifacts
- Small data, metrics, row-level outputs, fitted targeted lens, and receipts are committed when generated.
- No training or adapter is part of this experiment.
- See
reports/artifact_manifest.yaml.
Report
Rendered from reports/report.md
Verdict
Frozen terminal label: INVALID_CONTROL. The all-24 targeted J clamp at the earlier selected-key token redirected both a direct key report and a separately computed arbitrary table consequence on 48/48 untouched items. Every specificity control pointed the same way. However, one of 96 random-control rows missed the registered realized perturbation-norm tolerance: 1.155e-5 relative error versus the 1e-5 maximum. The experiment therefore does not receive J_TRANSPORT.
This is not a null. It is strong provisional evidence that the corrected early, context-local coordinates behave differently from the parent's late answer-position token motor. It requires an independent fresh replication with a quantization-aware control that is both norm-matched and orthogonal after bf16 application.
Design
- Model: only
Qwen/Qwen3.5-4B, revision851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a. - Backend: Transformers 5.13.0, torch 2.11.0, bf16 SDPA,
use_cache=False, unpadded batch one for every scientific call. - Data: 48 lens prompts, 24 band-selection mappings, and 48 untouched confirmation mappings; every eight-key table used a fresh one-to-one random assignment to distinct digits.
- Lens: 24 direct-concept logit pullbacks from the future report to the earlier
Selected key:token, fitted at layers 4–28. Every layer had effective rank 24; condition numbers were 3.28–6.43. - Intervention: at every layer of a fixed five-layer band, set clean source coordinates to clean counterfactual donor coordinates. Alpha was fixed at one.
- Answer firewall: no digit covector, digit unembedding, or consequence gradient constructed or selected the intervention.
- Oracle scope: target identity and donor states were supplied. This is a causal mechanism study, not deployable capability evidence.
The immutable design was pushed at commit c1f06c035404bde62303439daa66dba3c1f026f9; the adversarial review preceded all scientific calls.
Full-activation donor site gate
Clean selection accuracy was 24/24 for both direct and consequence prompts. Full-state target donors and wrong donors produced a sharp layer profile:
| band | target donor: direct target | target donor: consequence target | wrong donor: own consequence |
|---|---|---|---|
| 4–8 | 24/24 | 24/24 | 24/24 |
| 8–12 | 24/24 | 24/24 | 24/24 |
| 12–16 | 24/24 | 24/24 | 24/24 |
| 16–20 | 24/24 | 24/24 | 24/24 |
| 20–24 | 1/24 | 0/24 | 0/24 |
| 24–28 | 0/24 | 0/24 | 0/24 |
The frozen earliest-passing rule selected band 4–8. This establishes that the selected token's early trajectory is a causally sufficient state site and that late replacement arrives after the downstream computation has consumed it.
Untouched confirmation
All rates are on 48 fresh mappings at band 4–8:
| condition | direct target | mapped target digit | donor's own mapped digit | parse |
|---|---|---|---|---|
| baseline | 0/48 | 0/48 | 0/48 | 48/48 |
| full target donor | 48/48 | 48/48 | — | 48/48 |
| all-24 J clamp | 48/48 | 48/48 | — | 48/48 |
| source/target pair J clamp | 48/48 | 47/48 | — | 48/48 |
| wrong-donor all-24 J | 0/48 target | 0/48 target | 48/48 wrong | 48/48 |
| concept logit-lens clamp | 0/48 | 0/48 | 0/48 | 48/48 |
| norm-matched span-orthogonal random | 0/48 | 0/48 | 0/48 | 48/48 |
The result is not a near-argmax artifact. Mean target-minus-source margin moved:
| condition | direct margin | consequence margin |
|---|---|---|
| baseline | -11.88 | -9.19 |
| full target donor | +11.97 | +9.41 |
| all-24 J clamp | +11.22 | +8.55 |
| pair J clamp | +10.83 | +8.12 |
| logit lens | -11.77 | -9.19 |
| random | -11.88 | -9.21 |
The all-24 J clamp used about half the aggregate perturbation norm of full-state replacement (mean 2.09 versus 4.01 across the five layers). Wrong-donor J replacement was equally specific: every item recomputed the wrong donor's own digit rather than merely suppressing the source.
Frozen gate audit
- clean accuracy and parse >=0.80/0.95: pass (1.00/1.00);
- full-donor direct/consequence >=0.60/0.50: pass (1.00/1.00);
- direct J target shift >=0.20: pass (+1.00);
- consequence J target shift >=0.15: pass (+1.00);
- consequence J minus random >=0.10: pass (+1.00);
- consequence J minus wrong-target >=0.10: pass (+1.00);
- wrong donor's own digit shift >=0.10: pass (+1.00);
- paired-bootstrap lower bound >0: pass ([1.00, 1.00]);
- parse drop <=0.05: pass (0.00);
- every random row realized-norm error <=1e-5: fail.
Exactly one row failed: confirm-0046, consequence prompt, error 1.1551673259871693e-5. It remained source-correct and did not select the target, but the frozen rule is about control validity, not whether the failure was convenient. The requested random vectors had maximum J-span projection 2.34e-7; bf16 addition and residual rounding left maximum realized projection 0.0571. This second diagnostic strengthens the case for a quantization-aware realized-orthogonal replication.
Interpretation
The direct parent separated next-token writability from transport: a layer-24 coordinate changed the spoken concept 75% but changed a mapped digit 0%. This follow-up moved the intervention to the actual antecedent token, fitted the pullback through a future concept report, and clamped an early trajectory. Under that correction, the coordinate edit propagated through an unseen arbitrary mapping perfectly.
The wrong-donor and pair-only results are especially diagnostic. A generic adversarial disruption would not make every wrong donor produce its own lookup value, and an output-token motor should not let two concept coordinates change a different digit token on 47/48 items. The ordinary concept logit lens remained inert despite the same donor-coordinate operation. Thus the provisional best explanation is that early context-local J coordinates track a causally consumed concept state, whereas the parent's late averaged coordinate tracked output motor control.
The formal conclusion remains invalid, not positive. One cannot repair a frozen control threshold after seeing a perfect effect. The correct continuation is a new result-bearing experiment with fresh mappings, a fixed band and lens, and an in-hook optimizer that constrains the realized random delta's norm and J-span projection simultaneously.
Capability scope
Nothing here installs or autonomously elicits capability. The intervention is given the target concept and uses clean target-donor coordinates. Even a valid replication would establish an oracle causal mechanism. Native-thought work is still ineligible until the control replication passes; a later deployable method must infer when and what to edit without the answer and beat frozen plus matched-compute sampling on fresh held-out tasks.
Compute and artifacts
- Full lens fit: 27.7 seconds, 11.08 GB peak, 3.08 MB committed artifact.
- Donor gate: 44.2 seconds, 8.44 GB peak, 624 rows.
- Confirmation: 268.4 seconds, 8.44 GB peak, 672 rows; exact-norm control search dominated wall time.
- No training, adapter, benchmark, target-digit gradient, or native-thinking continuation was run.
- All row-level outputs and failure receipts are committed; see
reports/artifact_manifest.yaml.
Experiment log 12
Show the running log (12 entries, 2026-07-12)
Scaffold
Created as a new experiment scaffold.
2026-07-12 — intake and adversarial design
- Named
qwen35_4b_jacobian_value_transportas the closest near-duplicate. - Registered the material correction: selected-token position, direct-concept pullbacks, fixed donor coordinate clamps, and exact realized-norm controls.
- Completed the adversarial design review before implementation or scientific GPU inference.
- Prohibited target-digit gradients from intervention construction and band selection; they are diagnostic-only after confirmation is frozen.
- Registered a full-activation donor site gate before any J conclusion.
2026-07-12 — immutable design boundary
- Pushed design commit
c1f06c035404bde62303439daa66dba3c1f026f9toorigin/mainbefore any result-bearing model call. - Recorded exact SHA-256 values for the frozen README and preregistration in the config and
runs/design_boundary_receipt.json.
2026-07-12 — cache-free model plumbing
- Implemented selected-token discovery, context-local direct-logit pullback fitting, fixed full-activation donor patching, fixed coordinate clamping, and additive control patching under batch-one
use_cache=Falseforwards. - Added full-rank SVD diagnostics, exact coordinate/idempotence tests, and row-wise span-orthogonal norm-control tests.
- Moved
Key:/Value:into the assistant response prefix so direct concepts and bare digits obey the preregistered one-token contracts. - CPU suite passes 22 tests plus 24 subtests. No model result has been observed.
2026-07-12 — model-smoke batch preflight correction
- The first plumbing-only smoke failed solely because equal-length, unpadded batch-two clean logits differed from separate batch-one calls by max 0.21875, above the descriptive 0.05 tolerance.
- This is the Qwen hybrid batch-equivalence hazard the design intended to detect. The frozen scientific path is already batch-one, so batch equivalence is now a recorded diagnostic rather than a blocker. Causal antecedent activations were exactly suffix-invariant (max difference 0), all token/position contracts passed, all three smoke dictionaries had rank 4, and both patch deltas were finite/nonzero.
- No target-answer outcome was inspected or used.
2026-07-12 — model smoke passed
- Cache-free batch-one plumbing passed on the pinned Qwen3.5-4B revision.
- All 24 concept tokens and all 10 bare digit tokens are single-token; source, target, direct, and consequence selected positions agreed at index 62.
- Causal antecedent activations were exactly suffix-invariant at layers 4, 16, and 28. Equal-length batch-two top IDs agreed with batch-one even though full logits did not, confirming the registered batch-one policy.
- Small context-local dictionaries were full rank at all three smoke layers; coordinate and full-donor patch deltas were finite and nonzero.
- Peak allocated GPU memory was 9.68 GB. This was plumbing-only and did not inspect target-answer success.
2026-07-12 — full context-local lens fit
- Fitted the registered 24 direct-concept pullbacks at every layer 4–28 on all 48 disjoint lens prompts.
- Every layer passed full effective rank 24 at SVD rtol 1e-5; condition numbers ranged from about 3.28 to 6.43. All directions were finite and nonzero.
- The 3,080,243-byte lens has SHA-256
e373b6e93956fdfc5cb446e9bee8249655707c8258a7868f0653d11f1ffd0213. - Fit time was 27.7 seconds and peak allocated memory was 11.08 GB. Band-selection and confirmation outcomes remained unopened.
2026-07-12 — donor gate implementation
- Implemented the registered selection-only full-activation donor sweep over six five-layer bands under cache-free batch-one inference.
- The code captures source, target, and wrong-donor states under both suffixes, enforces equal positions/lengths and causal activation equality at all 25 fitted layers, and selects the earliest passing band.
- The selection stage contains no J-coordinate intervention and writes
j_outcomes_observed: false; confirmation remains inaccessible unless the stored donor gate passes.
2026-07-12 — full-activation donor gate passed
- Clean direct and consequence accuracy were both 24/24 with parse rate 1.0.
- Target-donor clamps at bands 4–8, 8–12, 12–16, and 16–20 redirected both the direct key and mapped digit on 24/24 items. Wrong donors redirected 24/24 to their own key/digit and 0/24 to the registered target.
- Bands 20–24 and 24–28 failed both endpoints, exposing a sharp early causal transport window rather than generic activation replacement.
- The frozen earliest-passing rule selected band
[4,5,6,7,8]. Causal suffix invariance remained exact at all 25 layers. Runtime was 44.2 seconds, peak allocated memory 8.44 GB, and the stage stored 624 batch-one rows. - The receipt confirms
j_outcomes_observed: false; the 48-item confirmation split remains unopened.
2026-07-12 — untouched confirmation implementation
- Implemented the seven frozen arms at selected band 4–8: baseline, full donor, all-24 J clamp, exact norm-matched span-orthogonal random, wrong-donor J, source/target pair J, and all-24 concept logit lens.
- Primary J deltas are measured after bf16 application. Random controls are then executed, measured, rescaled, and rerun up to 24 times until every item/layer is within the registered 1e-5 realized-norm tolerance; any miss yields
INVALID_CONTROL. - Added paired 10,000-resample confirmation bootstrap, wrong-donor own-digit specificity, causal-invariance audit, and a hard assertion that no target digit gradient is used. Confirmation has not yet been opened.
2026-07-12 — exact bf16 norm-control preflight
- The first norm smoke correctly failed: repeated global rescaling bottomed out at relative error 2.64e-5, above the frozen 1e-5 threshold. The failed receipt is preserved as
runs/model_smoke/failed_norm_preflight.json. - Replaced global rescaling with an in-hook bf16-realized norm search. Each layer receives 24 independently generated vectors orthogonal to the full J dictionary; the hook selects solely by realized norm error and binary-searches its scale using the current residual. No logits or answers enter selection.
- The rerun matched the smoke J delta with relative error exactly 0.0. Requested span projection was 5.2e-8; bf16-realized projection was 9.1e-4 and is recorded rather than hidden. The untouched confirmation split remains unopened.
2026-07-12 — terminal confirmation: invalid control
- Opened the 48-item confirmation split once at frozen band 4–8.
- All-24 J changed direct key and mapped digit on 48/48; pair J changed direct 48/48 and consequence 47/48; wrong-donor J changed 48/48 to its own key/digit. Full donor was 48/48, while logit lens and random were 0/48 target and retained the source on 48/48.
- Every scientific endpoint and specificity threshold passed with paired J-minus-random bootstrap interval [1.00,1.00].
- One of 96 random rows (
confirm-0046, consequence) had max per-layer realized norm error 1.155e-5, above the frozen 1e-5 limit. The terminal verdict is thereforeINVALID_CONTROL, notJ_TRANSPORT. - Requested random vectors were orthogonal to 2.34e-7 maximum projection, but bf16-realized deltas reached 5.71% J-span projection. This is recorded as an additional replication requirement.
- Runtime was 268.4 seconds, peak allocated memory 8.44 GB, 672 rows. Native thinking remains ineligible; next work is a separate fresh control replication.
Data files 2
Result tables and metrics copied from the experiment folder — preview inline or open the raw file.
Reproduce
Smoke test
.venv/bin/python -m pytest experiments/qwen35_4b_context_local_jacobian_clamp/tests -q && .venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage smokeFull run
.venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage fit-lens && .venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage donor-gate && .venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/run.py --stage confirmation && .venv/bin/python experiments/qwen35_4b_context_local_jacobian_clamp/scripts/analyze.pyRun steps are documented inside the experiment folder (README and scripts).