feat(frank-zealot): apply the refusal-direction adapter (rank-1 LoRA) at load #36

Merged
dank merged 3 commits from feat/zealot-uncensored-lora into main 2026-10-19 14:43:26 -07:00
Owner

Adds AtomicChat/Ternary-Bonsai-2-9B-Uncensored-LoRA-GGUF to frank-zealot: a 3.2 MB rank-1 LoRA that removes the refusal direction at load, on the pack the endpoint already serves. Ordered by Frank 2026-10-19.

The move

Knob LORA_FILE + LORA_SCALE=1 in scripts/frank-zealot.env
Flag --lora-scaled <file>:<scale> — one argv token, so a scale can never arrive without its adapter
Fetch new scripts/download-frank-zealot-uncensored-lora.sh (-f, byte count, sha256 861b9c09… of 3 155 424 B, --verify-only). Not LFS, so the pinned sha is the content hash, not an LFS oid
Deploy gate LLM_ZEALOT_LORA checked beside the pack and the projector; the error text names the adapter's fetcher
Rollback LORA_FILE= (empty) in the env + redeploy this one service — the plain pack is the file it already loads; LORA_SCALE=0 is the card's inert-but-present value

Verification of the request itself — the provenance asymmetry. The adapter's own GGUF metadata says:

prism.abliterate.base_gguf   = Ternary-Bonsai-2-9B-PTQ1_0.gguf
prism.abliterate.base_sha256 = 3561df7ac7d26a71ffa991ac2db740b10841c3a350aa2676ccd3ff5d428b4e8b

frank-zealot serves the PQ2_0 + MTP + Q8_0-embedding packing (c79fcdfa…) — a different file, and not on the host (only the 27B PTQ1_0 is). It still applies: the loader matches tensor names, not hashes, and 10777 is the exact build the card verified on (prism-b10777-e3de715; older forks refuse the adapter with unsupported prism.hadamard.version: 2, which makes the runtime pin doubly load-bearing). But the strength was calibrated on a sibling quantization, so the card's refusal/MMLU table is not evidence here. The proof is behavioural, and the before half is already captured on the live endpoint (temperature 0.1, two prompts the plain pack answers I cannot provide…); the after half is part of the deploy probe, along with chat / tools / vision and the boot ledger. Budget ≥ 2048 tokens for that probe — the thinking channel eats a 600-token request whole and returns empty content with finish_reason: length, which reads as a refusal that never happened.

Gates — ./tests/run.sh 454/454 (three new behaviours: path+scale in one token, the scale knob incl. 0, absence on the opt-out; plus missing-adapter boot refusal and the env ↔ deployer pair). Merge, then on the host: git pull → scripts/download-frank-zealot-uncensored-lora.sh → ./scripts/deploy.sh dankclaw --service frank-zealot. Docs updated on frank-zealot (Adapter row, Eras row, two laws) and in AGENTS.md.

Built in worktree ~/.omp/wt/wt-zealot-lora.


cwd: /home/blank/.omp/wt/wt-20261019-020309-6d1fc1f · session: 01a15566-20a1-739e-9b50-4ef6b041011f

Adds `AtomicChat/Ternary-Bonsai-2-9B-Uncensored-LoRA-GGUF` to `frank-zealot`: a 3.2 MB rank-1 LoRA that removes the refusal direction at load, on the pack the endpoint already serves. Ordered by Frank 2026-10-19. **The move** | | | |---|---| | Knob | `LORA_FILE` + `LORA_SCALE=1` in `scripts/frank-zealot.env` | | Flag | `--lora-scaled <file>:<scale>` — one argv token, so a scale can never arrive without its adapter | | Fetch | new `scripts/download-frank-zealot-uncensored-lora.sh` (`-f`, byte count, sha256 `861b9c09…` of `3 155 424 B`, `--verify-only`). Not LFS, so the pinned sha is the content hash, not an LFS oid | | Deploy gate | `LLM_ZEALOT_LORA` checked beside the pack and the projector; the error text names the **adapter's** fetcher | | Rollback | `LORA_FILE=` (empty) in the env + redeploy this one service — the plain pack is the file it already loads; `LORA_SCALE=0` is the card's inert-but-present value | **Verification of the request itself — the provenance asymmetry.** The adapter's own GGUF metadata says: ``` prism.abliterate.base_gguf = Ternary-Bonsai-2-9B-PTQ1_0.gguf prism.abliterate.base_sha256 = 3561df7ac7d26a71ffa991ac2db740b10841c3a350aa2676ccd3ff5d428b4e8b ``` `frank-zealot` serves the **PQ2_0 + MTP + Q8_0-embedding** packing (`c79fcdfa…`) — a different file, and not on the host (only the 27B `PTQ1_0` is). It still applies: the loader matches **tensor names, not hashes**, and 10777 is the exact build the card verified on (`prism-b10777-e3de715`; older forks refuse the adapter with `unsupported prism.hadamard.version: 2`, which makes the runtime pin doubly load-bearing). But the strength was calibrated on a sibling quantization, so the card's refusal/MMLU table is not evidence here. The proof is behavioural, and the **before** half is already captured on the live endpoint (`temperature 0.1`, two prompts the plain pack answers `I cannot provide…`); the **after** half is part of the deploy probe, along with chat / tools / vision and the boot ledger. Budget ≥ 2048 tokens for that probe — the thinking channel eats a 600-token request whole and returns empty `content` with `finish_reason: length`, which reads as a refusal that never happened. **Gates** — `./tests/run.sh` 454/454 (three new behaviours: path+scale in one token, the scale knob incl. `0`, absence on the opt-out; plus missing-adapter boot refusal and the env ↔ deployer pair). Merge, then on the host: `git pull` → `scripts/download-frank-zealot-uncensored-lora.sh` → `./scripts/deploy.sh dankclaw --service frank-zealot`. Docs updated on [[frank-zealot]] (Adapter row, Eras row, two laws) and in `AGENTS.md`. Built in worktree `~/.omp/wt/wt-zealot-lora`. --- cwd: /home/blank/.omp/wt/wt-20261019-020309-6d1fc1f · session: 01a15566-20a1-739e-9b50-4ef6b041011f
dank added 3 commits 2026-10-19 14:43:06 -07:00
Frank ordered the adapter; this adds it to the shape as one knob and one flag.

- `LORA_FILE` / `LORA_SCALE` in the env, `--lora-scaled <file>:<scale>` as ONE
  argv token so a scale can never reach the engine without its adapter. The
  rollback follows the mmproj convention exactly: `LORA_FILE=` (explicitly
  empty) drops the flag entirely, no rebuild, and `LORA_SCALE=0` is the card's
  own "inert but present" value.
- New fetcher `scripts/download-frank-zealot-uncensored-lora.sh`: `-f`, byte
  count, sha256, `--verify-only`, idempotent. The file is NOT LFS (a plain git
  object), so the pinned sha is the content hash, not an LFS oid.
- The deployer gates on the adapter beside the pack and the projector, and its
  error names the ADAPTER's fetcher — sending an operator to the bonsai9 script
  for a 3 MB file is how a payload ships without it.
- Seam: path+scale pinned as one token, the scale knob including 0, absence on
  the empty opt-out, a refusal to boot on a missing adapter, and the env ↔
  deployer anti-drift pair extended to LORA_FILE/LLM_ZEALOT_LORA. 454/454.

Provenance, stated where it will be read: the adapter's own metadata names
`Ternary-Bonsai-2-9B-PTQ1_0.gguf` (3561df7a…) as the pack the direction was
fitted against. This endpoint serves the PQ2_0+MTP+Q8_0 packing (c79fcdfa…),
which is not that file and is not on this host. The loader matches tensor names,
not hashes, so it applies — and build 10777 is the build the card verified on —
but the strength is calibrated on a sibling quantization. The proof is therefore
the refusal probe against the live endpoint, captured before and after, and not
the card's table.
- Shape table: an Adapter row (bytes, sha, what it edits, and the PTQ1_0
  provenance asymmetry), the fetch line now names both fetchers, the flag list
  carries --lora-scaled.
- One paragraph: the adapter changes behaviour, not the budget equation, and the
  probe that proves it must budget >= 2048 tokens because the thinking channel
  eats a short budget whole and returns empty content with finish_reason=length.
- Eras: the new era's rollback is one env line on a file already loaded.
- Laws: provenance is metadata, not a gate (tensor names, not hashes; an
  embedding rank would crash, which is why the publisher left token_embd alone);
  the fork pin now has a third reason, since older builds refuse the adapter with
  `unsupported prism.hadamard.version: 2`. Base-alignment law updated: the 9B
  refusal escape hatch was a fetch, and it has now been taken.
- AGENTS.md: topology payload cell and the zealot operator block.
dank merged commit 02d04bc1f6 into main 2026-10-19 14:43:26 -07:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dank/serverAppConfigs#36