Daily — 2026-06-16 (5 results promoted; 4 workflow fixes auto-applied)
updated: 2026-06-17
What happened
- Heavy autonomous day across ~11 active issues (542, 597, 612, 640, 641, 642, 647, 649, 651, 653, 654). 5 clean-results promoted useful: #528, #556, #608, #613, #614.
- #612 (on-policy sycophancy) and #597 (filler-control multiseed) ran multi-round same-issue follow-up loops to completion; #649 LEVEL/CHANGE decomposition auto-completed (kind:analysis).
- Lots of self-healing in-flight: ~8 workflow-fixes auto-applied + merged during the day (sparse-worktree merge-base in codex-code-reviewer/reconciler, vLLM
use_tqdm=Falsein gotchas, Step 10d stale-folder import, verify_task_body false-positives, the watcher capacity-retry pass forno_compute_availableblocks). - Two compute infra blocks (
no_compute_availableon #642, #654) — the auto router exhausted all lanes (gcp→nibi→fir→mila); expected capacity exhaustion, handled by the new watcher retry pass.
Applied workflow improvements
- Target:
.claude/rules/gotchas.md— what: added two fresh-instance robustness traps (rc=134PyGILState_Releaseshutdown-abort treated as false failure; gitignoreddata/issue<N>/strands on a fresh clone) — commit:33e44e8eabWhy: #654 session a9e2d80e — the WildChat-slice subprocess wrote its output then SIGABRTed on Python shutdown (PyGILState_Release), theset -euo pipefailEXIT-trap read rc=134 as fatal and powered off the GCE instance, destroying a complete artifact. Separatelydata/issue654/battery.jsonwas gitignored, absent from the fresh GCE clone, and the dispatcher crashed consuming it (sentinel then erased by the EXIT-trap delete). Both code fixes landed in-session but the generalizable gotchas were absent (grep confirmed noPyGILState/rc=134/gitignored-data entry). Applied edit:+ - **HF `datasets` / `transformers` subprocesses can exit `rc=134` (SIGABRT) with a `PyGILState_Release` fatal abort DURING interpreter shutdown — AFTER the work already completed...** ... RULE: check the ARTIFACT before treating a non-zero rc as fatal. (Incident #654) + - **A dispatcher that consumes a `data/issue<N>/` artifact MUST self-build it on a fresh instance — gitignored data does NOT travel with the branch clone.** ... RULE: begin with a `[ ! -f "$ARTIFACT" ]`-gated build step. (Incident #654) - Target:
CLAUDE.md(Routing experiment intent) — what: made variable-count an explicit NON-criterion for follow-up routing — commit:5ca9669543Why: Session c703b4f1 ~07:15 PT — Thomas: "why wasn't this run as a followup to 642?" I had filed the on-policy + matched-LR work as a NEW child #652, justifying it with "it changes ≥2 variables", then had to archive #652 and re-route as a same-issue follow-up on #642. I admitted: "variable-count isn't the routing criterion ... I conflated it with question-identity." The litmus existed in CLAUDE.md but never explicitly disowned variable-count as the criterion — exactly the conflation that recurred. Applied edit:- ON THE SAME QUESTION is ALWAYS the same issue. A new child task is reserved ONLY... + ON THE SAME QUESTION is ALWAYS the same issue. **The NUMBER of variables changed is NOT the routing criterion** — a follow-up that changes ≥2 things ... is still the SAME issue if the result would rewrite the parent's `## Takeaways`; variable-count is a plan / consistency-checker concern, never a question-identity one. Conflating the two is a recurring misroute (#642→#652, 2026-06-16). A new child task is reserved ONLY... - Target:
.claude/skills/group-promotion-queue/SKILL.md— what: required the rendered grouping report to carry an explicit caveat that it is an organizing index, not a per-task verification — commit:ae1dfcb5ceWhy: Session f415b203 ~06:49 PT — on "triage awaiting promotion" I rendered the cached title/claim grouping and presented it as the triage; Thomas: "Did you do a deep dive into each". The skill is read-only-grouping by design, but its output read as a finished triage rather than a first-pass index, so the deep read (/promote-clean-result) looked already done. Added a required italic caveat line to the report template + the prompt instructions. Applied edit:+ _Organizing index only (clustered from frontmatter + Takeaways + finding headlines) — claims/figures are NOT verified here; deep per-task review happens in `/promote-clean-result`._
Lint gate (workflow_lint.py --check-references + --check-asks): PASS after all four edits.
Other problems & notes
- #653 newly-filed experiment under-scoped on breadth (HELD — genuinely ambiguous intent on a new direction). Sessions 40d2e6e8 (~07:44) + 2c05e183 (~09:06). Thomas broadened scope in three corrections: "see if it holds for non rank 1 lora" → "this is going to test across many behaviors and contexts right?" → "do 2 other behaviors, and a few other contexts. Restart." The original draft picked the narrowest scope (single behavior/context/rank-1) when the Goal generalizes. Held per the judgment-call carve-out (scope of a brand-new direction is Thomas's call), but the recurring pattern is real. Suggested action: when drafting a
proposed kind: experimentwhose Goal is a general claim, default the design to ≥2-3 behaviors/contexts and flag breadth axes explicitly, leaving the planner to trim. Worth considering as aplanner.md/experiment-proposernudge if it recurs. - task.py CLI flag-guessing (NOTE — already documented, agent didn't read). Session 50bd4711 ~04:32 —
set-body 649 --body-file ...rejected (flag is--file),--evidencerejected, marker summarytoo long (551 chars; max 200). All self-corrected in-session; CLAUDE.md already documentsset-body <N> --file. No doc gap — agent guessed instead of reading. No fix. - Failure-lesson consolidation: no destructive merge tonight. 22 agent-memory feedback files were freshly written today by the in-flight Step-7 crash-fix hook (experiment-implementer, experimenter, reconciler, workflow-improver). All distinctly named and themed; no obvious duplicates. Pruning/merging agent memory is borderline-destructive, and the miners flagged none as wrong, so left intact. The two NOVEL generalizable lessons (rc=134, gitignored-data) were promoted to gotchas.md above.
- #642 capacity auto-fix (CLOSED in-session, no action). Session 0a2784d9 ~19:38 — Thomas: "why didn't these experiments auto fix themselves?" Genuine watcher gap (no capacity-retry pass for
no_compute_available), already diagnosed + fixed in-session (autonomous_session_watch.pycapacity_retry_pass, 27 tests, merged79b2890f11). Noted so it isn't re-flagged.
My thoughts
Highlighted results
- #528 — Validating cleanly installs above base under a custom-role-header LoRA on the one trait-encoding cell where the base has headroom (MODERATE)
- #556 — The role-header encoding's leakage advantage reverses on re-test: at 10 fresh seeds with regenerated training text, it leaks the validating trait more than a system-prompt encoding (MODERATE)
- #608 — Positive-only sycophancy training installs at least as strongly as the contrastive mix at every dose the rate can measure, but spreads sycophancy to nearly every other persona (MODERATE)
- #613 — The glued no-separator suppression does not carry over when the marker moves one token downstream — a single space collapses the source drop, falsifying the slot-geometry-tolerance account (MODERATE)
- #614 — Removing the default-assistant correction rows erases the assistant-twins' trained-down readings without making them adopt the trained agreement habit (LOW)