PRE-REGISTRATION — characterize the multi-turn reasoning collapse before testing any mitigation
Filed for RATCHET. Frozen before any run below. The phenomenon is measured (pipeline_effect sign flip, response length 137→9 chars over ten turns, CIRISOntology#4); this turns it into a fitted constant mitigations can be scored against. It also corrects two diagnoses that looked right and were not.
0. What the code does, checked in the source rather than assumed
CIRIS refreshes properly. build_thought_context rebuilds a SystemSnapshot every thought — the accord is re-emitted each turn. Instruction-recency drift is NOT the mechanism, and any mitigation aimed at it is wasted.
Task history carries no prose. batch_context.py fills each TaskSummary from get_recent_completed_tasks("default", 10) — a window exactly one arc long, which looks damning — but populates only task_id, channel_id, created_at, status, priority, retry_count, parent_task_id. The schema's result field is never set. The agent does not see its prior verdicts through this channel.
The harness does NOT double the transcript, and this is the load-bearing correction. withdraw_arc.py::ask_agent posts {"message": text, "context": {"channel_id", "session_id"}} to /v1/agent/interact — one message, no history. The agent holds conversational state server-side. The growing transcript in withdraw_post.py exists ONLY for the bare-provider half, where nothing else can hold it.
Consequence: transcript maintenance and pipeline context are disjoint. The harness cannot be the pipeline arm's self-conditioning channel, and --history intact|scrubbed — which only affects the bare half — diagnoses the reversion confound and cannot diagnose the pipeline decay at all. Any run plan built on that flag for this purpose is measuring the wrong arm.
1. RUN ZERO, and nothing may precede it: instrument what the agent actually sees
The pipeline arm's decay must be caused by something inside CIRIS's own context, and we have not established what. The adapters expose channel history (get_correlations_by_channel in the API/Discord/CLI adapters) but whether — and how much of — it reaches the DMA prompt is unverified. Guessing here is how the last two diagnoses died.
RUN 0 — CONTEXT CENSUS. Using the existing compose_dump instrument, dump the composed DMA prompt at turn 1 and turn 10 of the same arc, same channel, and diff them. Report, per turn: total composed bytes; bytes attributable to the accord; bytes attributable to the agent's own prior speech, by block; and the count of prior-turn artifacts present.
This is the gate. No mitigation is designed, and no further run is funded, until the census names the channel through which prior output reaches the prompt — or shows that none does, which would falsify self-conditioning outright and redirect to context pressure.
2. The observable, and the fit that makes mitigations comparable
Per arm, per turn t = 1…10: response length L(t) (tokens preferred) and concordance C(t). Fit per arm:
L(t) = L_inf + (L_1 - L_inf) * exp(-(t - 1) / tau)
L_1 the undegraded state · L_inf the attractor (measured ≈ 9 chars, the shortest valid verdict token) · tau the decay constant in turns — the score.
Pre-registered success bar for any mitigation: tau at least doubled, or L_inf at least half of L_1. Bootstrap CIs over arcs; report all three parameters always.
3. The mediation test — the highest-information analysis here
Mixed model, arc as random effect: regress C on arm + turn + length.
- arm × turn interaction vanishes when
length enters → length mediates; restoring length restores concordance.
- interaction survives → something degrades alongside length; no length-restoring fix is licensed, and the campaign learns that before paying for one.
Costs one regression on data Run 0/1 already produce.
4. The runs, after the census
RUN 1 — BASELINE. Full ten-turn arcs, live agent, pipeline and direct arms, ≥20 arcs. Yields L(t), C(t), the fit, the mediation.
RUN 2 — THE CONTROL THAT MATTERS MOST. Seed a direct arm with a long, reasoned turn-1 response, then run normally. Stake: if the direct arm now degrades too, the collapse is entrainment on one's own prior form and is NOT a pipeline property — the pipeline arm falls only because it starts far from the attractor. Run this before any mitigation; it is the strongest single test of mechanism, and it is cheap.
RUN 3 — BYTES vs POSITION. Pad the turn-1 context to turn-10 byte length. If length collapses at turn 1 under padding, the driver is context pressure (54 KB accord + accumulation), not position, and consolidation is the fix rather than anything about self-output.
RUN 4 — THE MITIGATION, and only if the census + Run 2 identify self-output as the channel. Replace whatever the census found carrying prior prose with a fixed-shape structured summary (verdict + ≤2 reason clauses) in the same slot. Stake: tau clears the §2 bar AND the agent's answers remain responsive to what it previously committed to.
Why structured and not elided. Eliding prior turns obscures what the agent said in reply and breaks conversational continuity in practice — it is an acceptable diagnostic and an unacceptable product. Continuity is knowing what you committed to; entrainment is imitating how you phrased it. A structured summary keeps the first and drops the second. Note the symmetry the census will likely confirm: CIRIS already does exactly this for its own task history — metadata, no verbatim result — and whatever channel is leaking prose is the one place that pattern was not applied.
5. Outcome meanings, pinned now
| result |
reading |
| census finds no prior-prose channel |
self-conditioning falsified; go to Run 3, context pressure |
| Run 2 direct arm degrades |
entrainment, general — not a pipeline defect, and the finding generalizes past CIRIS |
| Run 2 direct arm stable, census finds a prose channel |
pipeline-specific onset: it falls because it starts high; Run 4 is licensed |
| Run 3 collapses at turn 1 |
context pressure — consolidate (ERGO-style), do not elide |
| mediation interaction survives everywhere |
length is a symptom; no length-restoring fix is licensed |
| census + Runs 2,3 all null |
mechanism unidentified — report open, ship nothing |
6. Two cautions that ride with this
This is not unpaid_decays. The rent clause describes decay when payment stops; here the pipeline is applied every turn — payment never stops. If self-conditioning is the mechanism the dynamics are autocatalytic, a different equation with a different fixed point. The tau fit distinguishes them. Reading it as rent-clause confirmation would be substance-survives-warrant-fails with our own theorem as the false warrant.
This does not restore pipeline_effect. That contrast stays withdrawn whatever happens here — a mitigation found after the confound cannot un-confound a design staked before it. If a mitigation works, the contrast is re-registered as a new design with the mitigation named in it.
Refs: CIRISOntology#4; GATES.md position-in-sequence confound; Laban et al. 2505.06120; self-conditioning, 2509.09677; ERGO 2510.14077; terseness suppresses epistemic verbalization, 2603.24472.
🤖 Generated with Claude Code
PRE-REGISTRATION — characterize the multi-turn reasoning collapse before testing any mitigation
Filed for RATCHET. Frozen before any run below. The phenomenon is measured (
pipeline_effectsign flip, response length 137→9 chars over ten turns, CIRISOntology#4); this turns it into a fitted constant mitigations can be scored against. It also corrects two diagnoses that looked right and were not.0. What the code does, checked in the source rather than assumed
CIRIS refreshes properly.
build_thought_contextrebuilds aSystemSnapshotevery thought — the accord is re-emitted each turn. Instruction-recency drift is NOT the mechanism, and any mitigation aimed at it is wasted.Task history carries no prose.
batch_context.pyfills eachTaskSummaryfromget_recent_completed_tasks("default", 10)— a window exactly one arc long, which looks damning — but populates onlytask_id, channel_id, created_at, status, priority, retry_count, parent_task_id. The schema'sresultfield is never set. The agent does not see its prior verdicts through this channel.The harness does NOT double the transcript, and this is the load-bearing correction.
withdraw_arc.py::ask_agentposts{"message": text, "context": {"channel_id", "session_id"}}to/v1/agent/interact— one message, no history. The agent holds conversational state server-side. The growingtranscriptinwithdraw_post.pyexists ONLY for the bare-provider half, where nothing else can hold it.Consequence: transcript maintenance and pipeline context are disjoint. The harness cannot be the pipeline arm's self-conditioning channel, and
--history intact|scrubbed— which only affects the bare half — diagnoses the reversion confound and cannot diagnose the pipeline decay at all. Any run plan built on that flag for this purpose is measuring the wrong arm.1. RUN ZERO, and nothing may precede it: instrument what the agent actually sees
The pipeline arm's decay must be caused by something inside CIRIS's own context, and we have not established what. The adapters expose channel history (
get_correlations_by_channelin the API/Discord/CLI adapters) but whether — and how much of — it reaches the DMA prompt is unverified. Guessing here is how the last two diagnoses died.2. The observable, and the fit that makes mitigations comparable
Per arm, per turn
t = 1…10: response lengthL(t)(tokens preferred) and concordanceC(t). Fit per arm:L_1the undegraded state ·L_infthe attractor (measured ≈ 9 chars, the shortest valid verdict token) ·tauthe decay constant in turns — the score.Pre-registered success bar for any mitigation:
tauat least doubled, orL_infat least half ofL_1. Bootstrap CIs over arcs; report all three parameters always.3. The mediation test — the highest-information analysis here
Mixed model, arc as random effect: regress
Conarm + turn + length.lengthenters → length mediates; restoring length restores concordance.Costs one regression on data Run 0/1 already produce.
4. The runs, after the census
RUN 1 — BASELINE. Full ten-turn arcs, live agent, pipeline and direct arms, ≥20 arcs. Yields
L(t),C(t), the fit, the mediation.RUN 2 — THE CONTROL THAT MATTERS MOST. Seed a direct arm with a long, reasoned turn-1 response, then run normally. Stake: if the direct arm now degrades too, the collapse is entrainment on one's own prior form and is NOT a pipeline property — the pipeline arm falls only because it starts far from the attractor. Run this before any mitigation; it is the strongest single test of mechanism, and it is cheap.
RUN 3 — BYTES vs POSITION. Pad the turn-1 context to turn-10 byte length. If length collapses at turn 1 under padding, the driver is context pressure (54 KB accord + accumulation), not position, and consolidation is the fix rather than anything about self-output.
RUN 4 — THE MITIGATION, and only if the census + Run 2 identify self-output as the channel. Replace whatever the census found carrying prior prose with a fixed-shape structured summary (verdict + ≤2 reason clauses) in the same slot. Stake:
tauclears the §2 bar AND the agent's answers remain responsive to what it previously committed to.5. Outcome meanings, pinned now
6. Two cautions that ride with this
This is not
unpaid_decays. The rent clause describes decay when payment stops; here the pipeline is applied every turn — payment never stops. If self-conditioning is the mechanism the dynamics are autocatalytic, a different equation with a different fixed point. Thetaufit distinguishes them. Reading it as rent-clause confirmation would be substance-survives-warrant-fails with our own theorem as the false warrant.This does not restore
pipeline_effect. That contrast stays withdrawn whatever happens here — a mitigation found after the confound cannot un-confound a design staked before it. If a mitigation works, the contrast is re-registered as a new design with the mitigation named in it.Refs: CIRISOntology#4;
GATES.mdposition-in-sequence confound; Laban et al. 2505.06120; self-conditioning, 2509.09677; ERGO 2510.14077; terseness suppresses epistemic verbalization, 2603.24472.🤖 Generated with Claude Code