/new) is real, but it sits next to
three open visibility PRs. Opus 5: comment only. Posted
this comment.
No second coding PR while #84867
is unanswered.
Pace is deliberate: about an hour a day, model contributor rather than high-volume. Hermes is the right on-ramp — we run it daily, so a scoped bug is cheap to reproduce and hard to fake. This week’s loop was mostly triage discipline, then one real PR, then a second candidate that stayed comment-only.
Before opening anything new, inventory open authored PRs. This session: no open upstream Hermes PRs. The SessionDB FD work (#74304) had closed August 11. Clean slate for a weekly bite.
Fork-only leftovers (Agent-Reach self-PR, local drafts) stay out of the weekly queue until they have a real upstream path.
Hermes issue traffic is high. Fresh P2/P3 bugs get scooped within hours. The filter we actually used:
Same-day examples that failed the filter:
| Issue | Why skip |
|---|---|
| Grok 4.6 xhigh / priority | Two open PRs already |
cron attach_to_session | Two open PRs |
| backup locked-DB hang | PR open |
| MCP lazy dispatch | PR open |
| xAI aux 403 | Scooped mid-session |
| SSH false “1 commit behind” | Scooped + banner PR pile |
gh pr list --search ISSUE returns a live PR with the right shape,
do not open a parallel one. Link and move on.
#84716
looked perfect on paper: macOS launchd hermes gateway restart waits only
restart_drain_timeout (default 0), while systemd uses
restart_after_turn_timeout + drain + headroom (default ~21615s). Fresh shells
miss SIGUSR1 (ancestor-only helper) and force-interrupt in-flight cron.
Measured on upstream/main @ d2c6af3aa. Then the ownership check:
We wrote a measured plan (defaults, control flow, competing PRs), then ran a Nous
consult with anthropic/claude-opus-5 (empty toolsets, usage file, hashed transcript).
Verdict: APPROVE-WITH-NITS — do not open a competing PR this week.
What we did instead (August 12):
#84698:
invalid-JSON recovery stored (tool_name, error). Two parallel calls to the
same tool — one valid JSON, one broken — poisoned the valid sibling and skipped execution.
agent/conversation_loop.pySkipped and never rantest_empty_tool_name_loop_dampening.py)Two options went to Opus:
| Option | Behavior | Call |
|---|---|---|
| A — attribution only | Key by index/id; still Skip valid siblings | Reject as primary |
| B — mixed execute | Key by tool_call_id; execute valid; error only broken; all-invalid keeps 3× retry | Ship this |
Opus: APPROVE-WITH-NITS — B, not A. Also: rekey the truncation scan by id in the same commit (same bug class); require full-loop side-effect tests, not helper-only unit tests.
Default advice was claim + 24h. We shortened it: a self-closed unmerged PR with zero discussion is abandonment, not “stepping away for lunch.” Courtesy is the claim line (“unless you’re still on it”); calendar delay would have been theater.
upstream/mainconversation_loop.pyFixes #84698, credits #84759fix(agent): key invalid-JSON tool recovery by call id, execute valid siblings
- Key by tool_call_id (never name)
- Mixed valid+invalid JSON → execute valid siblings
- All-invalid → keep 3× API retry + id-keyed recovery
- Truncation scan rekeyed by id; hard-stop semantics unchanged
/new (#84870)
After #84867 landed as the week’s coding PR, we scouted again. Top free pick:
#84870
(P2, 0 comments). Gateway /new chains a new session with
parent_session_id and end_reason=session_reset.
hermes sessions list / the desktop sidebar still show the
stale lineage root (old title, old timestamp).
Measured on upstream/main @ e4f480510. Three sites all follow compression only:
| Site | What it does today |
|---|---|
list_sessions_rich CTE | Does not walk /new children |
| Python projection | Skips non-compression roots |
get_compression_tip() | Same compression-only walk |
_LISTABLE_CHILD_SQL only admits roots + branches, so the live tip is a hidden child.
No data loss — search still finds the messages.
Three open PRs already own the other axis: make reset children independently listable, not project the parent row forward to the tip.
| PR | Axis |
|---|---|
| #83987 | Gateway-boundary children listable |
| #84198 | Same visibility, session_reset only |
| #84009 | _reset_from marker + list predicate |
If those merge as written, the reporter may see two rows (stale root + tip) — arguably worse. Projection is then more justified, as a follow-up, after a maintainer picks UX.
Measured brief (CTE lines, competing PRs, #84867 still unreviewed) → Nous
anthropic/claude-opus-5. Verdict: APPROVE Option A — comment only.
Do not open a fourth PR in a contested session-list pile while #84867 has no reviews.
Posted August 12 (evening CDT) on #84870 only — no traffic-cop comments on the three PRs:
Repro confirmed on main @ e4f4805. List projection only follows
end_reason = 'compression' — CTE, Python projection, and
get_compression_tip() all agree — so a session_reset tip is a hidden
child and the row keeps the root's title/time.
Adjacent open PRs (#83987, #84198, #84009) make reset children
independently listable rather than projecting the parent row forward.
If one lands, this likely presents as two rows — stale root and tip.
Maintainer call before anyone writes code: one row per lineage
projected to the tip, or parent + child both listed?
| Step | Do | Don’t |
|---|---|---|
| Portfolio | List open authored PRs first | Stack parallel unknown-scope PRs |
| Scout | Filter for free + clear root cause | Trust titles; stampede piles |
| Ownership | gh pr list --search N + timeline |
Assume “open issue = free” |
| Plan | Measured defaults + grepped code paths | Vibe-based “one-liner” guesses |
| Second opinion | Opus with measured brief + NEVER column | Fabricated numbers in the brief |
| Social | Claim issue; link prior art; stand-down line | Compete with green same-shape PRs |
| Code | TDD full-loop when behavior is the bug | Helper-only tests that pass on broken main |
| Wait clocks | Self-closed abandon → claim + code | Artificial 24h when the author already left |
| Adjacent shape | Comment the issue; name the UX fork; sit | Fourth PR in a contested cluster; traffic-cop the other PRs |