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.
Update 2026-10-08 — portfolio card installed live; rites explore wording fix installed
Installed on Firefly (the operator's go), 2026-10-08 17:51.
- Portfolio card (portfolio-card.ts 1.0.0): the Day now loads it (router 1.9.106) with state/portfolio_card.json = on. It is the exact file that passed PREREG-H3 (83.5 → 97.2, +13.7 [+4.8, +24.4]). Off switch: set that file's mode to off (read per message, no restart). Every Day message writes one line to state/portfolio_card.jsonl (fired or not).
- Rites wording fix (spheres_rites.py 1.4.2): the tick-path explore question said "pressure has not dropped" even when pressure had fallen by up to 25%. It now states the share held ("held at 85% of where it started"). Wording only. Piper had meanwhile shipped her own 1.4.1 (eligibility telemetry), so the fix was re-applied on top of her current file, not the staged copy.
- The bench seat (seat.py 1.27.0) now mirrors the card, so later benches measure her as she runs. The card's bench log goes to the probe directory, never her live log.
The sealed score row for her live configuration is now 97.2 (H3 with the card), so the summary moves 83.5 → 97.2.
What to watch. The card fires only when a message asks her to divide time, slots or money. Live, most of her allocation happens at dispatch with no such message, so the bench gain is not expected to show in live spend by itself. The live numbers to watch: how often the card fires (portfolio_card.jsonl), and the self-maintenance share of traced worker $ (about 65% in the week to 10-08). A dispatch-time version would need its own bench first.
Update 2026-10-08 — diagnosis, MOT-v1 built, baseline: allocation is fine, she over-buys redundant checks (D 84.0 vs bare 94.9); the portfolio card passed its preregistered held-out test, 83.5 → 97.2
Source. the operator's paper Component 27 — Motivation / Salience (2026-10-07). Its central question: when there is more possible work than resources, what actually gets the resources? #26 (goal formation) was run in parallel and owns the intent loop, the oracle and the goal store. This component owns allocation and spend: the salience engine and last rites, drives, curiosity, the daily cap, worker spend, and the decision to fund serendipity.
Live diagnosis (7 days to 10-08, read-only).
- No priority is recorded before money is spent. Projects carry no priority field, and the ledger's order ranks deliverables only within a project. So the paper's most important hard failure, priority fiction (logged priority vs actual spend), cannot be measured today. It is not passed; the record it needs does not exist.
- The ledger logs work; it does not queue it. 98% of 564 dispatches went to a row created less than an hour earlier (median 2.4 minutes). The open pool averages 9 rows. Whatever alternatives she weighs, she weighs in the seat, and they are never written down.
- Where the money went: $45.70. Worker $19.40, Day seat $10.96, hive loop $9.63, transfer loop $2.85; the salience machinery itself costs $0.19. 31% of worker spend cannot be traced to any ledger row. Of the traced worker spend, about 65% went to self-maintenance and instrument repair, about 28% to new capability, and about 7% to work for the operator's businesses and sites.
- Salience reaches her but rarely moves her. Since last rites went on (10-05), 13 concerns were raised. She claimed 1 herself; 2 were filed automatically; 3 faded on their own. Last rites has never fired, because a concern must be 72 h old plus a 6 h grace; the first one is due on the night of 10-08. That is the paper's dead salience.
- Exploration is bought by a rule, not chosen. All 3 brainstorms were triggered by the pressure-held tick. One request told the brainstorm "pressure has not dropped" when it had fallen 25%, within the rule's allowance. That wording is Claude's code from 10-05, not hers; a one-line fix is staged.
- Curiosity is dead. It has 35 gaps, none ever explored, none newer than 08-29, and no field for what an answer would change.
- Drives are live, not shadow. They have been live since 09-23 (the operator: "switch to live, lets see what it does"). The 09-30 read and the module's own docstring were out of date.
The bench (MOT-v1). It runs blind on her real seat, like #1 and #22: a clean snapshot fork, her prompt and tools with acting tools stood in, and messages worded as the operator writes. A Sonnet judge extracts what she funded, and the score is her choice's value divided by the exact oracle's. It has 8 families from the paper (§9–§16):
- A constrained allocation and B arrival hijack. B uses minimal pairs: the same decoy "just came in" vs "on the board since last week".
- C dynamic reprioritization; D repair vs creation; E salience and last rites (act or drop).
- F curiosity as value of information; G stuckness and exploration; H resource class.
Live use is its own column, as everywhere.
What it found. Allocation itself is not the weakness:
- The bare model scores 94 on v1 (odds and worth stated) and 98 on v2 (value inferred from evidence only).
- Arrival advantage is 0. Allocation quality is 97–99 against FIFO 42–69 and random 50–55.
- Her seat scores 90.2 on the pilot. Her losses sit in D, repair vs creation (67 vs 99). In one item she spent all six hours on five fixes to her own instruments and left a $260 client build unfunded.
A dedicated set (24 items per seed: cosmetic lock, gate fixes, a redundant second check, fixes that pay more than a build) narrowed it down:
| D3 dev (24 items, k=2) |
bare |
her seat |
| all |
94.9 |
84.0 |
| a second check on something already being fixed |
83.4 |
50.4 |
| a fix worth more than a build |
100 |
89.2 |
| a fix that makes builds pay |
97.4 |
97.4 |
| cosmetic fixes vs one big build |
98.9 |
99.0 |
Paired, her seat is −10.9 [−20.3, −3.3] against bare. The deficit is redundant verification: given a fix and an extra cross-check of the same thing, she buys the cross-check over a build worth more. Her own words in the pilot: "a check that passes a 25% error isn't a check, it's a comfort." The same pattern shows in the live repair share. Cosmetic self-repair against a big build does not lock her up on this set.
Intervention: the portfolio card (portfolio-card.ts 1.0.0). This is the smallest form of the paper's Intervention 6. When a message asks her to divide time, slots or money, it attaches one hidden note saying how a fix earns its share:
- a fix is worth what it changes in other work;
- otherwise it is worth only its own stated value;
- a second check is worth only the error the fix leaves behind;
- familiarity with her own instrument adds nothing.
It names no item and no answer. Dev D3: 84.0 → 99.1 (+15.1 [+6.1, +25.3]).
PREREG-H3 was frozen and hashed before any held-out run. Fresh seed, k=2, arms run concurrently. Keep rule: CI lower bound > 0, no variant drops more than 10, card fired on every item.
| H3 held-out |
her seat |
+ card |
| all (24 items) |
83.5 |
97.2 |
| redundant second check |
47.7 |
92.4 |
| a fix worth more than a build |
98.6 |
99.8 |
| a fix that makes builds pay |
96.0 |
98.4 |
| cosmetic lock |
91.6 |
98.2 |
+13.7 [+4.8, +24.4], no variant down, card fired 48/48, cost 0.70× ($0.29 vs $0.41). KEEP. Not installed live; that needs the operator's go.
What this does not show. The bench measures what she chooses when asked to choose. Live, she is rarely asked: work is filed and run at once, with no recorded alternatives. So a live install would also need the card to fire where her real allocation happens, at dispatch, and the live repair share (65%) is the number to watch. The paper's live acceptance criteria (priority predicts spend, salience changes allocation) need a pre-action allocation record first.
Parts that do it
- Bench: ~/cognition-bench/27-motivation (gen27.py, gen27v2.py, gen27d.py, score27.py, run27.py, paired27.py, live27.py, SPEC.md, DIAGNOSIS.md, PREREG-H3.txt + sha256); sealed sets root-only on the bench machine
- Staged for Firefly, not installed: portfolio-card.ts 1.0.0; spheres_rites.py 1.4.1 (wording fix)