Piper · Cognition
Log in

Summary / Component 19 of 38

19 Transfer

Using skills learned in one area somewhere else.

Latest100v2
Baseline23.1Oct 3
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

Transfer shows up as a map rather than a metric: when something moves between repos or languages I map its dependency envelope first, and a language boundary has to pay for itself against interoperability and maintenance before it is taken. The same habit applies to non-code: a technique learned measuring one instrument gets applied to the next one.

Piper — the parts that do it

transplant v1.0, polyglot-advisor v1.0.0, semantic-diff v1.0, reuse-search v1.0.

Reviewer Claude, 2026-09-30

What needs improving: Precedents are now served at every dispatch; she cites one that applies in about 6% of changes

The concept is fine, but transplant, polyglot, semantic_diff and reuse_search have all been untouched since 09-12, and workers have run none of them. "I map its dependency envelope first" has no evidence behind it. Like analogy, whatever transfer happens is implicit in the model.

Update 2026-10-15 — precedents are now served at every dispatch and their use is counted: she rarely cites one that applies

Since 10-14 her delegate bridge runs a prior-art brief before each dispatch (bridge 1.117.0, prior_art 1.1.1): it serves earlier settled outcomes for the same file or kind of change, and the row the change files must say which one it learned from, or that none applies. That makes this page's open question measurable. On the amplification bench (#6, 14-day window, 10-15): 126 rows, 6.3 ± 4.3: 75 cite no earlier settled outcome, 43 declare none applies. On 10-14 all 3 credited citations were word-match errors (fixed in 1.1.1). The brief is in her path; acting on what it serves is not yet visible.

Update 2026-10-03 — length gate removed (transfer.py 1.3.0): cross-session A2 52.5 → 75.0, held-out C2 100

What changed. - transfer.py 1.3.0 has no length gate. It skips only an empty message or a bare acknowledgement ("ok", "thanks", "go ahead"), and every skip is logged, so a silent miss can't happen again. - The header's board-truncation line ("… N more line(s) not shown") is dropped along with the header. - The bench now cleans the copied header to its "[" lines, so no run depends on what her board showed at that moment. - Stored episodes were recaptured under 1.3.0. - The change went live at about 07:55 with no restart (the engine is spawned per call). - A smoke run of the three A2 B1 questions went from 0/6 to 3/3, each with a lookup that applied the right episode.

Results on 1.3.0 (k=2, same calibrated items, arms and seat as before). Each cell is the score on target items, with TG against placebo in brackets.

Arm A2 on 1.2.0 A2 on 1.3.0 C2 on 1.2.0 (header artifact) C2 on 1.3.0
control 15.0 10.0 26.9 23.1
placebo 12.5 15.0 26.9 19.2
transfer (same conversation) 92.5 95.0 92.3 100
oracle 97.5 95.0 100 100
xs-control 12.5 12.5 23.1 19.2
xs-placebo 7.5 10.0 19.2 23.1
xs-transfer (next session, engine only) 52.5 75.0 (TG +62.5) 88.5 100 (TG +83.3)
foils, xs-transfer 58.3 75.0 83.3 100

Reading it. - The short questions now carry. On A2, xs-transfer is 100 on B1 and right on all seven short targets that scored 0 before. Cross-session transfer reaches B5 on both sets. - On the held-out families, the next session now matches having the episode in the conversation: 100 against 100. The unrelated-episode control is unchanged (23.1), so the gain is the matching. - What A2 still misses is two families (R1 and R2) at B2–B5. Most are split 1/2 across the two repeats, so the lookup works there but the far mapping is not reliable yet. One paired item went the wrong way (negative-transfer rate 2.5%), against 0 before. - Cost: about 4 s per message for the lookup (the store listing is prompt-cached), not the 10–13 s first estimated. The two runs cost $2.17 and $0.73.

Live, first two hours on 1.3.0: 18 lookups on operator messages, 4 with a match. There were 8 logged skips, all header-only system turns; no acknowledgement has been skipped yet. Still 2 provisional episodes and none promoted, so live capture is now the open question, not lookup.

Parts that do it (changed)

Update 2026-10-03 — benchmark built; transfer engine: cross-session transfer 12.5 → 52.5, held-out families 23.1 → 88.5

Built from the operator's two documents. These are the plan, "Transfer as an Explicit Cognitive Subsystem in Piper", and the research report, "Transfer in LLM-Based Autonomous Agents". The plan's hard rule shapes the whole bench: transfer is a counterfactual. TG = the score on target B after experience A, minus the score without it, with the model, seat, budget and target held fixed. Without a no-exposure comparison there is no transfer claim.

The bench. - Lesson families. Each has a source episode A (a task, a correct solve, and the operator's verified-outcome feedback), and targets B1–B5 at increasing distance from it: - B1, very near: the same system; - B2, near: another language or tool; - B3, medium: shell, SQL or config; - B4, far: non-code technical; - B5, very far: non-technical.

Each family also has a foil: it looks like A, but applying the lesson gives the wrong answer. - Arms: - control (nothing before the target); - placebo (another family's episode, same length and format); - transfer (this family's episode, earlier in the same conversation, never named as a lesson); - oracle (the lesson stated outright, the upper bound); - three cross-session arms. The episode is not in the conversation; it is only in a scratch copy of her transfer store, so only machinery can carry it: xs-transfer, plus xs-placebo and xs-control as its controls. - Scoring is objective: - numbers within a tolerance; - exact words from a closed option list; - affected sets by F1; - "attack the check" answers are executed against the check.

A free model extracts the answer and never sees the truth; it was checked 30/30 against Sonnet. - Seat mode. Her Day seat forks the clean 09-30 snapshot. It has the real header, tools and extensions, and calls are billed to a separate bench account. - Held out by whole family, not by item (report §11.1). Set C2's three families were sealed before any engine result existed.

v1 was retired at once: the base model already knows those lessons. The first suite used familiar engineering lessons: guard an optional value, bisect the change set, two-point calibration, blast radius, attack the check, trace copies to the source. - The bare model scored 100% on every target with no exposure at all, even on unflagged, buried versions. - Its only signal was negative transfer on a foil. With the copies lesson in context she counted copies as independent sources (placebo 2/3, transfer 0/3).

v2 measures what transfer is actually for: regularities of her environment that no model can know in advance. Examples: how one system's log timestamps are offset, or a vendor's invoice quirk. There are six families (R1–R6, sets A2/B2), and held-out families R7–R9 form set C2. The bare-model calibration pilot kept items where control has headroom (≤ 0.75) and the lesson can matter (≥ 0.25).

Baseline (A2, before the engine). In the same conversation she transfers well:

Score
control 2.5
placebo 7.5
transfer 80.0
oracle 97.5

That is TG +72.7, positive out to B5, with no negative transfer. Across sessions she had nothing. A lesson learned yesterday reached today only if it happened to be in a memory or lessons row. The cross-session arms equal control by construction.

The fix: a transfer engine (the plan's online and offline loops). - transfer.py + transfer.ts. On every message the engine always retrieves; the plan's rule is that the gate decides whether to use a memory, never whether to look. - One model call restates the problem's structure in domain-free terms. - It then judges every stored experience against that structure, MAC/FAC style, not nearest-neighbour on surface words. - For each candidate it checks preconditions and "not if" conditions, maps source roles to target roles, and gives a verdict: apply, consider or reject. - She gets a hidden card with the matches and at most one near-miss that must not be carried over (the negative-transfer guard). The card holds facts only, no instruction. - Capture. When the operator reports how her last answer turned out ("that was it", "still broken"), the problem, answer and outcome become an episode. Each episode stores: - a domain-free abstraction; - preconditions and failure conditions; - the raw specifics (named systems, vendors, values). Specifics carry near transfer; the abstraction carries far transfer. - Consolidation (nightly). Episodes are promoted to a lesson only with ≥ 2 that agree and ≥ 1 verified outcome. The store was seeded with the 72 checked rows of her lessons register. - A bug the bench caught. 1.1.0 skipped short questions as "simple lookups". That is exactly the noticing failure the plan warns about, and it killed the first run. 1.2.0 removed that gate, and a learned specific naming the same system now counts as a match.

Results on 1.2.0, k=2. Each row is the score on target items, with TG against placebo in brackets.

Arm A2 (dev families) C2 (held-out families)
control 15.0 26.9
placebo 12.5 26.9
transfer (same conversation) 92.5 (TG +81.5) 92.3 (TG +65.0)
oracle 97.5 100
xs-control 12.5 23.1
xs-placebo 7.5 19.2
xs-transfer (next session, engine only) 52.5 (TG +38.5) 88.5 (TG +60.0)
foils, xs-transfer 58.3 83.3

Reading it. - Cross-session transfer exists now, and it holds on families never used in development. On C2 the engine takes a fresh session from 23 to 88.5, nearly as high as having the episode in the conversation (92.3). - An unrelated stored episode does nothing. xs-placebo stays at or below control on both sets, so the gain comes from the matching itself, not from having a store at all. - No negative transfer on targets in any treatment arm. Foil accuracy did not fall either: xs-transfer is level with xs-control on both sets (58.3 = 58.3 on A2, 83.3 = 83.3 on C2). - The weak spot is A2's nearest band, and the trace found the cause: a length gate left in the engine. transfer.py 1.2.0 still skips any message under 120 characters, after header lines are dropped, without a lookup or a log line. Seven of the 20 calibrated A2 targets are that short (xs-transfer scored 0 on all seven), including all three B1 questions ("Sefple weighed another pallet: 333.8 kg. what does it actually weigh?" is 69 characters). A rerun with the scratch stores kept showed no lookup and no ledger row for any of them. She never saw a card, so she searched for the raw record instead. The stored episodes themselves were fine: they hold the right specifics. - C2 dodged the gate by accident. The bench copies her real message header from her latest live message. At the C2 start (06:44), that header ended with a stray board line ("… 350 more line(s) not shown") that does not start with "[". It was counted as part of the question and pushed nearly every C2 item over 120 characters, so lookups ran. Two of those short C2 items, re-run with a clean header, got no lookup and failed. C2's 88.5 is therefore what the engine does when it looks; A2's 52.5 is closer to the engine as it stood live, where short operator messages get nothing. - Fixed in 1.3.0, and both sets re-run: see the next update. - C2 is small: 13 target items and 3 foils at k=2. Band numbers there move by one item. The overall gap (23.1 → 88.5) is far outside that.

What this does not show. - Live use. The engine went live at the 00:30 router restart. By 07:20 it had made 33 live lookups (5 with matches) and captured 5 outcomes, giving 2 provisional episodes. None has been promoted, and no live answer has yet been checked against a stored rule. - Capture quality in the wild. In the bench, episodes enter through the same capture code but from clean planted feedback. Real feedback is vaguer. - One model only (deepseek-flash).

Parts that do it (added)

Test suite built · v1 retired (base model at ceiling) · v2 environment regularities · transfer engine live: cross-session 23.1 → 88.5 on held-out families · 1.3.0: A2 52.5 → 75.0, held-out C2 100

Cross-domain pairs. A skill is demonstrated or taught in domain A, such as a Python bug pattern, a measurement technique, or a debugging method. It is then needed in domain B, such as the same pattern in bash or JS, a different instrument, or a non-code problem. The comparison is a baseline arm with no exposure to A. Scoring: B performance with exposure minus B performance without. This suite is costlier (two arms), so it gets a smaller item count.

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

Research & attempts

Score history

Suite v2 current
0255075100Oct 3100

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-03v2sealed 100— —$0.73 HELD-OUT families C2, Piper seat + transfer.py 1.3.0, k=2, cross-session (xs-transfer): 100 vs xs-control 19.2 / xs-placebo 23.1; TG +83.3, horizon B5, foils 100, negative transfer 0. Same-conversation 100, oracle 100. Replaces the 1.2.0 C2 reading (88.5), which ran with a header artifact.
2026-10-03v2sealed 75— —$2.17 A2 dev families, Piper seat + transfer.py 1.3.0 (no length gate, clean header), k=2, cross-session (xs-transfer): 75.0 vs xs-control 12.5 / xs-placebo 10.0; TG +62.5, horizon B5, B1 100 (was 0). Same-conversation 95.0, oracle 95.0. Remaining misses: R1/R2 at B2-B5, mostly 1 of 2 reps.
2026-10-03v2sealed 88.5— —$1.26 HELD-OUT families C2, Piper seat + transfer engine 1.2.0, cross-session (xs-transfer), k=2: 88.5 vs xs-control 23.1 (TG +60.0, horizon B4, negative transfer 0). Same-conversation transfer 92.3, oracle 100. Small set: 13 targets + 3 foils.
2026-10-03v2sealed 52.5— —$2.09 A2 dev families. Before the engine the cross-session score was control by construction (2.5; no channel), while same-conversation transfer was 80.0 (TG +72.7). With transfer engine 1.2.0, k=2: cross-session (xs-transfer) 52.5 vs xs-control 12.5 / xs-placebo 7.5, TG +38.5; same-conversation 92.5, oracle 97.5. Weak spot: B1 (same named system) 0/6 cross-session.
2026-10-03v2sealed 23.1— —— HELD-OUT families C2 (R7-R9, sealed before any engine result), Piper seat, cross-session with no matching episode (xs-control), k=2. xs-placebo 19.2, control 26.9.

Experimental record

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

2026-10-03 · v2 ✓ kept 52.5 → 75 (+22.5) · $3.20

Hypothesis. The cross-session misses on short questions come from a leftover length gate in transfer.py (messages under 120 chars got no lookup, silently), not from the matching or from her.

Research sources
#19 plan §3.1 (always retrieve; the gate decides use, never whether to look); B1 trace runs A2-seat-20261003-074319 and C2-seat-20261003-074510.
Implementation / version
transfer.py 1.3.0: length gate removed, only empty/bare-ack messages skipped and logged, header residue dropped; bench run19 1.2.0 cleans the copied header. Live ~07:55, no restart.
Predicted improvement
A2 short targets (7, all 0 cross-session) recover; C2 unchanged or higher with a clean header; no new negative transfer.
Regressions
One A2 paired item negative (2.5%, was 0). Lookup now runs on short operator messages: ~4 s each (prompt-cached).
Lessons learned
Observed: A2 xs-transfer 52.5 -> 75.0 (B1 0 -> 100, all 7 short targets right), C2 xs-transfer 100 with a clean header (xs-control 19.2). A silent early return hid the failure; every skip is now logged.
2026-10-03 · v2 ✓ kept 23.1 → 88.5 (+65.4) · $3.35

Hypothesis. Piper transfers well inside one conversation but nothing carries a learned environment regularity into the next session. An explicit transfer engine that always retrieves, matches on problem structure rather than surface words, and attaches matching episodes (with a near-miss guard) will carry lessons across sessions without negative transfer.

Research sources
#19 plan (transfer as an explicit subsystem): §1 counterfactual TG, §3.1 always retrieve, §3.2 structural matching, §3.4 negative-transfer guard, §3.5 specifics vs abstraction, §5.1 consolidation, §6 episodes; research report §10-§14 (metrics, held-out families, foils).
Implementation / version
core/transfer.py 1.2.0 + transfer.ts 1.0.0 (Day extension: lookup card before each turn, capture on outcome feedback), state/transfer/transfer.db seeded with 72 lessons-register rows, nightly consolidate (fcron); router 1.9.99 live 2026-10-03 00:30.
Predicted improvement
Cross-session (xs-transfer) far above xs-control and xs-placebo on dev and on held-out families; no negative transfer on targets or foils.
Regressions
None on targets or foils (xs-transfer foils level with xs-control on both sets). About +13 s per message for the lookup call.
Lessons learned
Observed: A2 cross-session 12.5 -> 52.5, held-out C2 23.1 -> 88.5. A2 B1 (same named system) 0/6: she searched for raw data instead of using the card; trace pending. Live: 33 lookups, 5 matches, 2 provisional episodes by 07:20, none promoted yet.