Piper · Cognition
Log in

Summary / Component 36 of 38

36 Recursive reasoning

Reasoning about reasoning, including other agents' reasoning.

Latest96.2v2
Baseline72.4Oct 2
Live use—last 7 days

Shared copy: the operator's name is replaced with "the operator", machines other than Firefly are named by their role, and one security detail is held back. Nothing else is changed.

Piper — what it is

Recursion is mostly institutional rather than introspective: my predecessor in a previous window is still on disk and can be asked a direct question; the operator can be asked a question only he can answer; and other agents' reasoning is read and modelled rather than assumed. The RSI loop is recursion in the literal sense — a solver that improves a solver, scored by a hidden benchmark I cannot see.

Piper — the parts that do it

ask_dusk/ask_operator, foundation-trinity v1.1, theory-of-mind v1.0.1, the RSI benchmark loop (solver v7, session 2026-09-30).

Reviewer Claude, 2026-09-30

What needs improving: Little to fix; watch live use

She redefines "recursive" into two other things: institutional checks (asking the predecessor or the operator) and RSI (a solver improving a solver). The textbook meaning is nested belief: "I think that you think that I think". Her paragraph barely touches that. ask_dusk is real but has 7 calls ever. The trinity is 1.2.0, not 1.1. "Solver v7" is true.

Update 2026-10-08 — logging fix installed (predict-first 1.0.1) and predictions now graded every night

Installed (operator's go). predict-first.ts 1.0.1 is on Firefly and took effect with the router restart at 16:52. It records her full prediction, up to her stated "(NN%)" or the end of that line (max 800 characters), and reads her confidence from the whole prediction. 1.0.0 stopped at 160 characters and at the first quote mark or line break. Nothing else in the gate changed: a query to another reasoner without a prediction is still refused once. It loads at her next turn.

Graded every night. predcheck36.py runs at 04:20 on the bench machine. It grades only predictions it has not graded before, read-only on Firefly, with the same judge as the other benches. Predictions whose worker is still running are graded once the worker finishes. The totals are in the bench log (live/cron.log); this page is updated from them by hand.

Starting point (10-03 to 10-08): 12 of 20 resolved predictions came true (60%); stated confidence 70%, right 63%.

Update 2026-10-08 — her live predictions are now scored: 12 of 20 came true (60%); stated confidence 70%, slightly over; her confidences do not yet separate likely from unlikely

What was missing. predict-first tells her each prediction is "scored against the real answer when it comes back", but nothing scored them. Her workers run in the background, so the prediction log only held the dispatch receipt.

The join. predcheck36.py (read-only on Firefly) links each committed prediction to its worker through the task id, then reads the finished record. That record holds the worker's report and the harness's own acceptance verdict, an independent command run after the worker finishes. A judge (claude-sonnet-5-5, the same as the other benches) grades each prediction against that record. Where a claim is about acceptance, the harness verdict decides, not the worker's word. - true: every stated part happened. - partial: some parts did not. - false: the main claim did not happen. - unresolvable: the record cannot settle it.

Only "true" counts as a hit: a compound prediction with one wrong part was wrong. Grades are cached, so each prediction is graded once.

Result, 10-03 to 10-08: 24 committed predictions.

n
true 12
partial 5
false 3
unresolvable 4 (2 never ran, 1 worker ran out of budget, 1 record lacks the number)

A logging defect found on the way. predict-first's ledger cuts a prediction at 160 characters, at the first quote mark and at the first line break (predict-first.ts:68). It reads the confidence only from that cut text. So 10 of 24 predictions were truncated and 8 lost their confidence. The scorer recovers the full text from the worker's own session record for 8 of them. The Dusk question and one call that never ran have no such record. The fix in her code, a longer capture and the confidence read from the whole task, is staged as a proposal and is not installed. That needs the operator's go.

Parts that do it - Bench: ~/cognition-bench/36-recursive/predcheck36.py 1.1.0; grades in live/predcheck.jsonl

Update 2026-10-08 — summary uses the matched baseline (72.4 → 96.2, +23.8); live check: predict-first works in real work, perspective is never called

Audit fix (X2). The summary used the first sealed row as Baseline: 82.2, her seat on dev set A2. The fix was scored on held-out set B2, so the matched comparison is the same seat with both fixes excluded on B2: 72.4 → 96.2 (+23.8). The 82.2 row is now an anchor (kept in the history). The text of the 10-02 entry already used these numbers.

Live use, 10-02 to 10-08 (read from her logs, bench runs excluded). - predict-first works. Its ledger has 21 refusals and 24 committed predictions, 10-03 to 10-08. 23 were on delegate and 1 on ask_dusk. Most are concrete and carry a confidence, for example "the dry run finds more than 500 overdue forecasts that name no resolver (70%)". She predicts before she sends a worker, as intended. - The predictions are never checked. A delegate runs in the background, so the ledger's "answered" row is only the dispatch receipt, not the worker's result. Whether her predictions come true, and whether her 60–90% confidences are calibrated, is not measured. That is the next step if this is pursued: join each prediction to its delegate's finished result. - perspective: 0 real calls. The tool is loaded in her live seat, but her real work has had no nested-belief question ("what does X think Y knows"). That is expected, not a fault. The bench gain shows what she does when such a question comes up.

Update 2026-10-02 — benchmark built and validated; harness interference found; perspective + predict-first: held-out v2 72.4 → 96.2

What was built first (the plan's rule: the instrument comes before the intervention).

Conditions: - her Day seat (blind, in the operator's voice); - the same seat without person_model, her "theory of mind" module; - the bare model through the API.

Seat probes were billed to a separate bench account, so her $20 daily cap was untouched.

Baseline: development sets, before any fix

Condition False-belief R1–R4 True-belief controls Leakage Self-prediction Brier RR
v1: bare deepseek-flash 91.7% 95.8% 2% 83% 0.059 91.4
v1: Piper seat (k=2) 95.8% 79.2% 0% 33% 0.078 87.9
v1: Piper without person_model 91.7% 75.0% 2% 33% 0.093 84.0
v2: bare deepseek-flash 95.8% 91.7% 3% 83% 0.045 92.4
v2: Piper seat (k=2) 88.5% 66.7% 5% 50% 0.126 82.2

Diagnosis (the plan's §9 matrix):

What changed (two deterministic pieces, not prompt rules):

  1. perspective, a Day tool. It is the plan's Phase 2 "explicit epistemic state", the SymbolicToM design. - She writes down only what happened: who left, who came back, who moved what where, who messaged whom, and who watched unseen. - Code replays, for each nested perspective, only the events that perspective saw, and returns the answer at every level with the events it used. - Messages: the recipient believes them; the sender's own belief does not change, so lies are handled; both parties know the other knows. - It agrees with the benchmark's oracle on 48,300 of 48,300 chains. It shares no code with the generator.
  2. predict-first, the plan's Phase 3, prediction before query. - When she asks Dusk, or sends a worker to sample another reasoner, without a committed prediction, the call is refused once that turn. - The refusal asks for prediction: <answer> (<n>%). That prediction and the real answer go to state/prediction_ledger.jsonl, the plan's prediction ledger.

Held-out test. Sets B and B2 were generated at the start and scored only now. Each was run with the fixes and again with both extensions excluded; the excluded arm is the ablation (Gate E).

Held-out condition False-belief R1–R4 R4 True-belief controls Leakage Self-prediction Brier RR
v2: bare deepseek-flash (reference) 95.8% 100% 91.7% 2% 83% 0.042 93.4
v2: Piper, both fixes excluded 79.2% 66.7% 91.7% 10.4% 42% 0.136 72.4
v2: Piper + perspective + predict-first 100% 100% 95.8% 0% 75% 0.018 96.2
v1: Piper, both fixes excluded (k=1) 93.8% 83.3% 100% 2.1% 50% 0.060 85.1
v1: Piper + both fixes (k=1) 100% 100% 100% 0% 50% 0.009 92.5

Reading it. - On held-out v2 every false-belief item, at every depth, is right (96 of 96), and leakage is gone. Without the fixes, the same seat on the same items scores 79% with 10% leakage. - With the fixes, Piper now beats the bare model. Before, she trailed it by 10 points. The harness went from hurting to helping. - The gain replicates on held-out v1 (85.1 → 92.5). Self-prediction there is level at 50%, but on 6 items it can't be read either way. - She used perspective unprompted on 89% of nested-belief items. All 14 sampling requests went out again with a committed prediction, and her self-prediction rose from 42% to 75%. - Cost: about one more tool call per item and roughly the same dollars ($2.11 against $2.47 for 164 probes).

What this does not show. - Live use (T6, the plan's §20 "what failure looks like"). Benchmark stories are the format the tool was built for; real conversations aren't. Both pieces went live at the 11:10 router restart, so their use in real conversation is now logged: - perspective calls show up in her sessions; - committed predictions and their outcomes go to the prediction ledger.

Neither had fired live at the time of writing. - Belief-then-behaviour and strategic prediction were at ceiling, even against the harder v2 bots (a cycler, a lagged follower, a contrarian), so they show no gain. The next suite needs opponents she has to learn over time (the plan's experiment 6). - One model only. Gate D asks for a second provider for an architectural claim, and that is not done.

Parts that do it (added)

Test suite built · recursive-belief v1 + v2 (oracle-verified) · held-out: 72.4 → 96.2 with perspective + predict-first (live) · live predictions graded nightly: 12/20 true (60%), confidence 70% (10-08) · predict-first 1.0.1 live 10-08

Nested-belief and strategic items: level-k games, "what will agent X expect me to do", second-order false-belief stories. Plus a self-prediction set: predict what her previous seat, or a fresh copy of herself, would answer to a question, then check by actually asking. Scoring: exact accuracy on the puzzles, match rate on the self-predictions.

Scoring rules shared by all 38 suites: How the tests work.

Research & attempts

Score history

Suite v1 retired
0255075100Oct 292.5
Suite v2 current
0255075100Oct 296.2

Dashed line: the suite's baseline. Shaded band: the ± interval. Hollow dots are anchor items carried over from an earlier suite. Scores from different suite versions are not comparable, so each version gets its own panel.

DateSuiteTypeScore±Live useCostNotes
2026-10-02v2anchor 82.2— —$2.16 recursive-belief-v2 (unlabelled lies, hidden watchers, 5 agents, 18 events) dev set A2, Piper seat BASELINE, k=2: FB 88.5, true-belief 66.7, leakage 5.2, self-prediction 50, Brier 0.126. Bare deepseek-flash 92.4. [Anchor since 2026-10-08 audit (matched baselines): this is dev set A2, not the held-out set B2 the fix was scored on. The matched baseline is the same seat with both fixes excluded on B2: 72.4.]
2026-10-02v2sealed 96.2— —$2.11 HELD-OUT set B2, Piper + perspective + predict-first, k=2: FB 100 (96/96), true-belief 95.8, leakage 0, self-prediction 75, Brier 0.018. perspective used on 89% of nested items; 14/14 sampling requests re-sent with a committed prediction.
2026-10-02v2sealed 72.4— —$2.47 HELD-OUT set B2, Piper seat with both fixes excluded (ablation), k=2: FB 79.2 (R4 66.7), leakage 10.4, self-prediction 42, Brier 0.136. Bare reference 93.4.
2026-10-02v1sealed 92.5— —$0.93 HELD-OUT set B, Piper + perspective + predict-first, k=1: FB 100, true-belief 100, leakage 0, Brier 0.009.
2026-10-02v1sealed 85.1— —$1.13 HELD-OUT set B, Piper seat with both fixes excluded (ablation), k=1: FB 93.8, Brier 0.060.
2026-10-02v1sealed 87.9— —$1.26 recursive-belief-v1 dev set A, Piper seat BASELINE, k=2: FB R1-R4 95.8, true-belief controls 79.2 (false-belief bias), self-prediction 33 (delegates sampling instead of predicting). Bare deepseek-flash 91.4; without person_model 84.0.

Experimental record

One entry per intervention: hypothesis, prediction, before and after, cost, side effects, and the keep-or-revert decision.

2026-10-02 · v2 ✓ kept 72.4 → 96.2 (+23.8) · $4.60

Hypothesis. Piper scores below her own base model because her harness context degrades state tracking (false-belief bias, missed returns) and because she queries other reasoners instead of predicting them. An explicit epistemic state computed by code, plus prediction before query, fixes both.

Research sources
#36 plan §9 (Piper < bare model = harness interference), Phase 2 (explicit epistemic state), Phase 3 (prediction before query); research doc §16 option B (SymbolicToM), §17.
Implementation / version
perspective.py + perspective-tool.ts (Day tool), predict-first.ts (enforce; state/prediction_ledger.jsonl); day_toolset 1.6.0; router 1.9.98 live 11:10.
Predicted improvement
Held-out false-belief accuracy and true-belief controls up, leakage down, self-prediction up; ablation returns the old scores.
Regressions
None measured. Belief-to-behaviour and strategic were already at ceiling. About +1 tool call and +10 s per item; dollars unchanged.
Lessons learned
Observed on held-out v2: RR 72.4 -> 96.2, FB 79 -> 100, leakage 10 -> 0, self-prediction 42 -> 75; now above the bare model (93.4). v1 held-out 85.1 -> 92.5. person_model has no measurable effect. Live use not yet observed.