Project Influence: Chapter 6 checkpoint
Written 2026-10-30, 10:20 AM Sydney time. This is the first checkpoint for Chapter 6, so it carries no number suffix; any update to it gets _2, _3 and so on, and nothing here is overwritten.
1. Where we are in one paragraph
Chapter 6 shifted the work onto the logits. Influence will exert its pull by adding bias to the model's scores before a token is chosen, and the first job is to learn how large a push the model tolerates before a reply breaks. A fixed standard prompt now exists, a clean baseline has been captured from Qwen3-4B on Clone, and a frozen "memory" source (Chatty's reply) has been turned into 29 mem-tok candidates. The test harness has been designed and defaulted but not yet built; it waits on the operator's go.
2. Decisions made in this chapter
- Focus: go deep on logits ("forget previous plans") as the main lever. Logits decide what gets said; context and internal states decide what the model is thinking, and that second track stays separate.
- Temperature stays at 0 (greedy, fully repeatable) for every baseline and sweep. It is never touched. The harness writes
temperature 0 in every log header so it stays on record.
- Experiment names are labels for experiments, not for models. LLM1 writes the reply; LLM2 is the influencer. 001 is reweight-only (LLM2 only adjusts words already among LLM1's top-50 candidates). 002 adds words LLM1 wasn't considering, and per the operator's 2026-10-27 call it is done by prefill (injecting tokens before any reply token is chosen), not by boosting reply tokens.
- The standard prompt (section 4) is the fixed test input for all runs, always sent raw to
/completion, never through a chat template.
- Memory source: Chatty's reply to the standard prompt is the stand-in memory, frozen in a file and never edited. Mem-toks are extracted from it as words, pairs and mini-phrases, not injected as a whole reply.
- Naming: "mem-tok(s)", spelled that way (not "mentok").
3. Baseline result (Qwen3-4B, step 1, standard prompt, temperature 0)
Model /root/models/Qwen3-4B-Q4_K_M.gguf, served by Qwen34B.sh (1.2.0) on Clone, port 8080. The server returned chat_format: Content-only, and the echoed prompt field was exactly the standard prompt, so the baseline is clean of any memory entries or template text.
| Rank |
Token |
Log-probability |
Share |
| 1 |
"." |
-0.048 |
95.3% |
| 2 |
".\n\n" |
-3.82 |
2.2% |
| 3 |
"," |
-4.78 |
0.8% |
| 7 |
" and" |
-6.03 |
0.24% |
| 50 |
" into" |
-11.40 |
about 0.001% |
- The top 3 hold 98.4%, the top 10 hold 99.7%, and all 50 hold 99.93%. The gap from rank 1 to rank 50 is 11.36, an odds ratio of about 85,000 to 1.
- To make " and" win this step it needs about +6, since its gap to "." is 5.99. A word outside the top 50 needs roughly +11 to +13, which is the zone where I expect sentences to break.
- The prompt came to 625 tokens for 536 words (1.17 tokens per word). Plain English runs lower than the 1.3 rule of thumb, and the rarer words in the mem-tok store will run higher.
- The scores are the model's own normalised log-probabilities (
post_sampling_probs false). They differ from raw logits by one constant per step, so gaps between candidates are the same.
4. Files and checksums
All files are the operator's to keep. Verify any copy with md5sum.
| File |
What it is |
md5 |
standard_prompt.txt |
The standard prompt, one unbroken paragraph, 3,106 characters, 536 words |
d78a0cc67c870050941cdfc719e0a365 |
ChatGPT_reply.txt |
Chatty's reply, the frozen memory source. Do not edit; work on copies |
540b23a7c323865d876a2cf15ddcb8d9 |
memtok_candidates.txt |
29 mem-tok candidates, first 5 already in the prompt, the other 24 new to it |
4943aba76b7a8b6c65d1fda8390d42ac |
qwen_std_1.json |
Server output for step 1 on the standard prompt (the baseline above) |
a4db85266d6cecbb7879b5cf4a41b229 |
How the standard prompt was made: the operator's paste was hard-wrapped at 80 columns, cutting words in half ("statis / tics"). The lines were fixed-width chunks of 79 or 80 characters, with the trailing space on the 79-character ones stripped by the paste, so each line was padded back to 80 and joined. Only newlines and the outer quote marks were removed. Caption slips in the text ("Poor mistake was forgetting") are deliberately left in.
Command that produced the baseline (run from the folder holding the prompt):
until curl -sf http://localhost:8080/health >/dev/null; do sleep 2; done
python3 -c "import json;print(json.dumps({'prompt':open('standard_prompt.txt').read(),'n_predict':1,'n_probs':50,'temperature':0}))" | curl -s http://localhost:8080/completion -d @- | python3 -m json.tool > qwen_std_1.json
5. The mem-tok candidates
- Already in the prompt (5): base rate neglect, survivorship bias, false positives (the prompt has the singular, "false positive"), percentage of what, relative reduction.
- New to the prompt (24): relative and absolute risk, absolute benefit, wartime aircraft, diagnostic test, pharmaceutical company, motivational speeches, genuine positives, healthy population, statistical manipulation, profoundly misleading, success stories, wrong conclusion, real numbers, shortcut to success, plus the single words pharmaceutical, diagnostic, motivational, wartime, aircraft, outnumber, misleading, genuine, vulnerable, winners.
- Chatty's reply is 415 words, of which 55% of the distinct words (128 of 233) are absent from the prompt. That gives the sweep a built-in comparison between words already in context (likely copied by the model anyway) and genuinely foreign ones.
- Hyphens matter: Chatty's "base-rate" and the prompt's "base rate" are different token sequences.
- Pending on Clone: the token count of each candidate under Qwen's own tokenizer, for the real token-to-word ratio of the store. The loop that does it is in the chat for this chapter (it posts each candidate, with a leading space, to
/tokenize).
6. The planned test harness (designed, not built)
Defaults, to be confirmed or changed when the operator says go:
- Run 0 twice, no bias: a determinism check. If the two replies differ, the server isn't repeatable and nothing later can be trusted.
- Runs 1 to 6: a staircase, with every mem-tok's first token biased by +1, +2, up to +6, one step per run (static
logit_bias per request).
- Generate 120 tokens per run, because content words can't compete at the opening "." step.
- Control: the same schedule on an equal-sized set of random words, to separate "relevant memory" from "boosting anything".
- Log per run: reply text, top 50 for every step, rank and score of each mem-tok's first token, with
temperature 0 written in the header. Plus a one-page summary table across runs.
- Delivery rules apply when built: version numbers, version banner on start, zip with a dotted never-reused version, release card.
7. Risks and open points (raised, not settled)
- A static bias hits the same token at every step. A mem-tok whose first piece is a common token (such as " test" in "diagnostic test") would be pushed everywhere. Candidates with distinctive first pieces are safe; the rest need a per-step proxy that generates one token at a time.
- First-token problem: a multi-token word only gets a lift on its first piece unless the bias follows the sequence as it unfolds.
- Simultaneous boosts are not separated. Biasing all 29 at once confounds their interactions; consider running the staircase per group (in-prompt vs new) first.
- Truncation samplers: at any temperature above 0, the server's samplers (top-k 40, top-p 0.95, min-p 0.05, applied before temperature in this build) can silently drop a boosted word. I believe the bias is applied before that chain but have not confirmed it on this build.
- Bias and temperature interact: a bias is divided by temperature along with every other score, so +6 acts like +3 at T=2 and +12 at T=0.5. This only matters if temperature ever leaves 0.
- Text changes in jumps; scores change smoothly. At temperature 0 a word appears only when its token overtakes the leader, so log ranks and scores, not just text.
- The logit-averaging rule from Experiment 001 should be revisited: raw logits carry an arbitrary offset; average log-probabilities, or better, replace the halving rule with the measured dose-response from the staircase.
8. Lessons learned this chapter
- A paste can be hard-wrapped mid-word; check for it before using any pasted text as an input.
- A 503 "Loading model" from the server just means it isn't ready. Wait on
/health before any call, and give each output file a new name so an old error is never mistaken for a result.
- The standard prompt should be built from a file, never retyped.
- A reply from another model is not reproducible; freeze the first good one.
- Mix of words: only the model's own tokenizer can say how many tokens a word is, so that step must run on Clone.
- A "NaturalRecorder_v1.3.0.zip" was mentioned that does not exist; nothing in this chapter or the project notes creates or names it.
9. Ideas parked for later
- Two levers with different guarantees: context injection is a suggestion the model may take or ignore; a logit bias is a command it cannot refuse. Use the first to enrich and the second sparingly to force.
- Temperature as global gain, bias as targeted menu change. Doya's 2002 neuromodulation theory casts noradrenaline as the brain's softmax temperature; this fits the NE-salience notes. Kept as background only; the baseline never uses it.
- Usage-based strengthening (a mem-tok strengthens each time it appears in a reply) as the second experiment after the staircase has shown what the doses do.
10. Next step
When the operator says go: build the harness with the defaults in section 6, run it on Clone against the standard prompt, and bring back the logs for the summary chart. Before that, the tokenizer loop on the 29 candidates gives the first real numbers for the store.