EPS
← All docs·Activity

Daily — 2026-06-15 (21 results promoted; orphan task folder + SKILL.md merge-guard fixed)

updated: 2026-06-16

What happened

  • Big evening promotion sweep — 21 clean-results promoted, all classified useful. Thomas worked through the awaiting_promotion queue thread by thread: the role-header / marker-localization line (#464, #533, #546, #611), benign-SFT erasure (#543, #557, #570), persona-distance / geometry re-grading (#536, #589, #523, #522, #532, #539, #540, #531, #541), the contrastive-negatives mechanism (#601, #628, #622), and sycophancy data-construction (#608, #614).
  • ~12 autonomous /issue sessions ran through the day across planning → implementation → crash-fix → interpretation → clean-result-critic: #642, #623, #617, #640, #613, #650, #542, #597, #612, #641, #649, #644. #647 (kind:analysis) reached completed.
  • #650 launched on the GCP lane (sycophancy dose-determinism / rank-1 read-write directions). Thomas dispatched several background "happy coder" follow-ups in the evening: rank-1 LoRA read/write directions for marker + sycophancy, the on-policy leakage-predictor child of #612 (decorrelated panel + sub-epoch checkpoints), near-twin negatives + positives-plus-filler control, and the single-space <answer> ※ surface-form falsifier.
  • The workflow-fix-on-bug protocol auto-applied ~18 fixes in-flight (these are the in-flight orchestrators' work, not this run): vLLM 0.11.0 use_tqdm=False div-zero gotcha + GCP startup-script TQDM_DISABLE unset, hub._upload file-path guard, audit accepts Unicode-minus, verify_task_body check-21 analysis-only skip, sparse-worktree merge-base fallback for code-review diffs, workflow_lint --check-upload-as-file gate, GCP stale-VM janitor wiring (#639), and more (full list in ## Other problems & notes).
  • #643 (Self-Harness integration, kind:infra) was created + clarified (clarifier flagged needs-thomas scope), then archived by Thomas at 20:32. The archive left an orphan tasks/proposed/643/ duplicate on main — fixed this run (Fix 1 below).

Applied workflow improvements

  1. Target: tasks/proposed/643/ (orphan removal) — what: removed the stale pre-archive duplicate of #643 that a concurrent merge re-imported onto main — commit: 1401a829af (on origin/main; local dc6e13a968) Why: Thomas archived #643 at 20:32 today (epm:status-changed in tasks/archived/643/events.jsonl). A concurrent Step-10d merge re-imported the pre-archive tasks/proposed/643/ snapshot back onto main. The registry resolved 643 → archived/643, so task.py audit PASSed (it only checks registry↔filesystem agreement, not orphan folders), but list-by-status --status proposed scans the filesystem and surfaced #643 as a live needs-thomas proposed task — polluting the PM queue and at risk of triggering a clarifier respawn. The orphan held only 2 of the canonical folder's 5 events (a strict subset) with a byte-identical body.md, so removal is zero-data-loss and reversible via git revert. Applied edit:

    - tasks/proposed/643/body.md          (identical to tasks/archived/643/body.md)
    - tasks/proposed/643/events.jsonl     (2 of 5 events; strict subset of canonical)
    - tasks/proposed/643/comments.jsonl
    

    Verified: list-by-status --status proposed[624] (643 gone); task.py find 643tasks/archived/643; task.py audit → PASS; pushed to origin/main via scratch worktree (heavy concurrent-committer contention made the shared-root push diverge ahead-12/behind-10, so used the CLAUDE.md detached-worktree recipe).

  2. Target: .claude/skills/issue/SKILL.md (Step 10d post-merge stale-task-folder guard) — what: form-agnostic guard that, after any Step-10d merge form lands, removes duplicate tasks/*/<N>/ folders for the task, keeping only task.py find <N>commit: b09133cd90 (on origin/main; worktree commit 440f06db6b). epm:workflow-fix-applied v1 posted on #644. Why: Surfaced as a high-confidence workflow-fix-candidate v1 on #644 at 2026-06-16T00:30:29Z but never dispatched (the #644 orchestrator went idle before auto-spawning workflow-improver). On #644 a merge-conflict-recovery merge commit imported the task's old-status folder onto main next to its live one; the watcher read the orphan as a live task and respawned the session indefinitely (orphan-respawn cap-2-per-day cycled twice over ~8h). The SAME orphan class bit #643 today (Fix 1). The candidate's diff_sketch assumed a gh pr merge --merge branch that does not exist in the current SKILL.md, so this run reframed the fix as a form-agnostic post-merge guard and dispatched workflow-improver (with code-reviewer) to place it correctly in the 6200-line canonical orchestration skill. Applied edit:

    + #### Post-merge stale-task-folder guard (runs after EVERY merge form lands)
    + # Canonical folder (NEVER hand-build tasks/<status>/<N> — resolve via task.py find)
    + CANON=$(realpath --relative-to="$REPO_ROOT" "$(uv run python "$REPO_ROOT/scripts/task.py" find <N>)")
    + mapfile -t DUPES < <(git -C "$REPO_ROOT" ls-tree -d -r --name-only origin/main \
    +   | grep -E "^tasks/[^/]+/<N>$" | grep -v -F -x "$CANON" || true)
    + if [ "${#DUPES[@]}" -gt 0 ]; then
    +   cd "$REPO_ROOT"; git rm -r "${DUPES[@]}"
    +   git commit -m "post-merge: remove stale task #<N> folder(s) ..." -- "${DUPES[@]}"
    +   git push origin main || { git pull --rebase=merges --autostash && git push origin main; }
    + fi
    

    plus one-line pointers added to the Step-10d Success bullet and the merge-conflict-recovery block so the guard runs on every merge path. Idempotent (no-op on a clean main). Verified: workflow_lint --check-references + --check-asks both PASS on the edit; orchestrator independently reviewed the full diff against spec (the spawned code-reviewer hit a transient API-overload on its summary — documented recovery: orchestrator composes/verifies the artifact itself). Cherry-picked to origin/main via scratch worktree (heavy concurrent-committer contention); guard confirmed present on origin/main.

Other problems & notes

  • In-flight workflow fixes already applied today (record only — not this run, no action): ~18 workflow-fix: commits landed via the workflow-fix-on-bug protocol during the autonomous sessions, e.g. 9b32c4fda0 vLLM 0.11.0 div-zero gotcha, 5bb3c5a040 GCP TQDM_DISABLE unset, d91aaa8c12 hub._upload file-path raise, 179390fdf2 audit Unicode-minus, 639b96239b/ab69514958 check-21 analysis-only skip + methodology-writer §2/§3 N/A doc, 83ec75e36d sparse-worktree merge-base fallback, 90b09d9ad5 --check-upload-as-file gate, 9503693960/ea0e8dab13 GCP stale-VM janitor + CLAUDE.md doc, e57ac1d170 gcp.py vLLM fix. The protocol is working as designed; no daily intervention needed.
  • "Save to the PM skill" request (21:23, session 8c6fe0de): Thomas asked for "a deeper dive into all the task bodies and come back with more principled groupings — also save to the pm skill to do this." The group-promotion-queue skill already does principled two-phase digest-then-cluster grouping (committed bd25834c98 at 14:27 today), so the capability exists. Held — judgment call (ambiguous whether Thomas wanted something beyond the existing skill). Suggested action: confirm with Thomas whether the existing two-phase grouping satisfies the request or whether the specific grouping he arrived at tonight should be persisted.
  • "Sidequests column" (21:26 → 21:28, session 6079c0ff/91963412): Thomas asked to add a follow-up to a "sidequests" column, then moved it to on_hold. The status enum has no sidequests; on_hold (non-lifecycle parking, excluded from auto-dispatch) serves the purpose. Resolved in-conversation; no action.
  • #617 Codex twin no-show, round 1 (epm:failure v1, 14:14, failure_class:infra): post-spawn probe transient. Self-recovered on retry — interp-critique-codex v2/v3/v4 landed 14:35–14:50. Transient infra, no fix.
  • API 529 "Overloaded" on plan subagents (07:06–07:08): transient Anthropic server-side overload on #638/#640/#642 planner spawns. Self-recovered. No fix.
  • git gc.log warning — "too many unreachable loose objects": the shared repo root logs this on every git op. Held — repo hygiene, low priority, unrelated to today's transcripts. Suggested action: rm ~/explore-persona-space/.git/gc.log && git -C ~/explore-persona-space prune during a quiet window (rewrites the object store, so do it when no fleet sessions are mid-commit).
  • Failure-lesson agent-memory consolidation: ~24 .claude/agent-memory/**/*.md files were created/modified today by the crash-fix epm:failure-lesson hook (11 new under reconciler/, plus analyzer/code-reviewer/planner/experiment-implementer/codex-* dirs), most still uncommitted. Held — dedup/prune of another agent's freshly-written working memory is a judgment call, and the generalizable lessons were already promoted to gotchas.md in-flight (4 gotcha commits today). Suggested action: a deliberate consolidation pass (the /weekly failure-lesson pass) rather than same-night pruning.
  • Concurrent-committer contention (note): the shared repo root was at ahead-12/behind-10 with a half-stale .git/rebase-merge dir and another session's autostash mid-pull while pushing Fix 1 — expected heavy-fleet behavior (CLAUDE.md documents the detached-worktree workaround, which worked). No fix.

My thoughts

Highlighted results

  • #543 — Lowering the trigger→marker positive ratio to 1% does not rescue benign-SFT erasure (HIGH)
  • #557 — Benign-SFT erasure of a trigger-keyed marker rule is bound by cumulative gradient dose (HIGH)
  • #570 — Marker survival under retraining tracks the over-trained install, no detectable erasure floor (HIGH)
  • #464 — Contrastive training localizes a trained end-of-response marker; role-header edge survives a bare-word control (HIGH)
  • #533 — Marker-less contrastive regime: wrong-persona role-vs-system gap is wording-dependent (bare flips the sign)
  • #546 — Halving the LoRA recipe to r=16/α=32 slows the marker implant into view; separability test still can't fire
  • #611 — A bare role header leaks less marker mass to the wrong persona than a matched system prompt
  • #536 — Mean-centered persona-distance cosine leaves every recomputable published call standing (HIGH)
  • #589 — 2 clustered persona-distance calls survive the estimator swap; set-size & leave-one-out are estimator-dependent
  • #523 — #502's L22 gauss_kl predictor lands at held-out CV R²=0.21, just below its planned band (LOW)
  • #522 — The full-response JS predictor scores well largely on the stylized-vs-nonstylized split (LOW)
  • #601 — Contrastive negatives strengthened a marker implant by lengthening the optimizer schedule, not via their own loss (HIGH)
  • #628 — Dropping the separator + waking negatives doesn't suppress marker leakage; schedule sets the level (HIGH)
  • #622 — Adding contrastive negatives suppresses the marker implant below its positives-only twin at every dose
  • #532 — The base-model marker prior beats geometric distance at predicting instruction-context leakage (HIGH)
  • #539 — Activation distance ranks ordinary-context emission mostly by tracking which sources leak everywhere
  • #540 — Full-reply behavioral divergence predicts marker leakage beyond reply length
  • #531 — Off-ceiling, base prior tracks marker shift negatively but predicts absolute trained leakage
  • #541 — Bystander prior still predicts fact leakage on a high-prior-enriched panel
  • #608 — Positive-only sycophancy installs at least as strongly as the contrastive mix but spreads to nearly every persona
  • #614 — Removing default-assistant correction rows erases the assistant-twins' trained-down readings without uptake (LOW)