Skip to content

Lane telemetry: work-loop #3177

Description

@kyle-sexton

Durable telemetry sink for the autonomous worker lane (work-loop).

Purpose: each running lane instance upserts one comment here, keyed by its instance ID, summarizing its most recent cycle. This issue is durable state — lanes rebuild from it after compaction. It is excluded from every lane's work frontier and is never itself a work item.

Convention:

  • One canonical comment per instance ID; the lowest-id comment for an instance stays canonical and is edited in place.
  • Instance ID shape: <hostname>-<lane>-<launch-timestamp>.
  • Do not close this issue while any lane instance is running.

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Aug 23, 2026
  2. kyle-sexton commented on Aug 23, 2026

    @kyle-sexton
    ContributorAuthor

    Instance melo-lap-001-worker-202608230449 — lane: work-loop. SESSION WOUND DOWN at 16:34Z via clean-stop. The loop is stopped; no further wakeups are scheduled. This comment is the durable record — everything a cold agent needs to resume is here or on the linked issues.

    Session outcome

    7 pull requests opened, 2 items escalated to the human floor, 0 yielded, 0 merged (this lane never merges).

    PR Closes What
    .github #93 #65 Document the Conventional Commits PR-title policy in CONTRIBUTING.md
    .github #94 #66 Remove the vestigial cadence dropdown from task.yml
    .github #95 #76 Reconcile "approved and green" with required_approving_review_count: 0
    .github #96 #70 Derive the issue-form file list at run time in the jsonschema lane
    .github #97 #67 Consistent optionality marking across the three issue forms
    .github #98 #69 Normalize the "Affected area" description voice
    ccp #3180 #3123 negation-without-positive detector on audit-noise, first detector-findings producer

    Known textual conflicts between these PRs, all documented in their own bodies and all merge-lane business: #93 vs #95 in CONTRIBUTING.md (adjacent lines group into one hunk); #97 vs #94 in task.yml (keep the de-suffixed area description, drop the cadence block); #98 vs #97 on the same bug-report.yml line; #3180 vs #3162 on the same shape table and tier case arms.

    Escalated to the human floor — awaiting a decision

    1. ci-workflows#511 — labelled needs-human, agent-ready removed. Tool-version drift whose absorb procedure bumps dependency pins and recomputes paired sha256: checksums, which is this lane's unconditional human floor regardless of its work-class: mechanical label. The open question is a standing policy call, not a per-issue one: may this lane absorb pin plus checksum bumps in ci-workflows autonomously? A yes unblocks the entire recurring tool-version-drift:v1 class; a no means triage should stop labelling them agent-ready.
    2. .github#58 — labelled needs-human + status: needs-decision. Its premise is false at this repo's pin: pr-issue-linkage.yml pins ci-workflows at e9443874 (v0.10.2), where no requiredSections array exists; the four-section contract first appears at v0.14.0. Every correct fix runs through a pin bump. Evidence in comment 5384611131.

    Both reduce to the same question, which is why the pin-bump policy answer is the single highest-value unblock available.

    IN FLIGHT AT STOP — 5 items, all claude-code-plugins, all mid-reviewer-loop

    Each worker was instructed at 16:34Z to commit its work-in-progress, push its branch, and post a cold-agent-resumable comment on its issue. Verify each branch reached the remote before trusting this list.

    Item Branch State at 16:34Z Lease comment
    #2891 claude/2891-deslop-shard6 0 commits, 6 dirty, unpushed 5386637109
    #3179 fix/3179-quote-yaml-indicator-branch 1 commit, 2 dirty, unpushed 5386638646
    #3164 fix/3164-audit-noise-porcelain-z 1 commit, clean, unpushed 5386639452
    #3132 fix/3132-check-ignore-two-probe 2 commits pushed, 5 dirty 5386708470
    #3133 fix/3133-typos-format-notebook-and-ctx-cap 0 commits, 5 dirty, unpushed 5386840339

    #2891 is a shard of an already-decomposed umbrella — its PR must reference #2891 WITHOUT closing it. It was panel-cleared 3 of 3 (verdict A) but its reviewer then returned CHANGES-REQUIRED on two items: a MAJOR at audit/SKILL.md:183 (the whose upstream is coordination still makes items 2 and 3 read as upstreams; needs a governing head such as "takes one of three shapes") and a MINOR at realign/SKILL.md:147 (a defining clause became a conditional, inverting the logic). #3164 is not a duplicate — merged PR #3171 delivered part of it, and the residual being added is porcelain -z handling; its PR must say so.

    Findings for the humans, none of which this lane could act on

    Lane-protocol defects found by running the lane

    1. The triage lane's leases starve the worker lane. It takes a 1-hour lease per item and never releases it when flipping to agent-ready, so handed-off items are unavailable for a full hour. Verified across eight items. Fix belongs in triage: release on the flip.
    2. The tracker seam has no release verb (capabilities lists only claim / renew-lease / reclaim) and comment deletion is permission-denied, so workers release by PATCHing superseded_at into their own lease comment. The takeover-comment convention shows the lane already expects releases to exist.
    3. A worker's reviewer subagent has no route back to its dispatcher — no ListAgents, and general-purpose is not addressable by name — so review findings bubble to the orchestrator and must be hand-relayed.
    4. Assignee cannot identify an instance; every lane on every machine assigns kyle-sexton. Ownership is decidable only from a lease comment's session_id.
    5. No repo in the org sets config.role_labels, so role-label resolution is a cited fallback to the seam defaults in lib/labels.sh.

    The two lessons worth keeping

    Brief premises are unreliable — wrong, unsourced, or incomplete on five of seven items, and twice in briefs I wrote myself. Every worker prompt now carries an explicit "verify the premise at the state actually in force, and report a false premise instead of manufacturing a change" instruction. My own two failures: dispatching #2891 to be decomposed when it already was, and passing on a claim that #3178 was open and rewriting plugin.json across 26 plugins when it is merged and never touched that file.

    Independent rationale-withheld review is not ceremony — it earned its keep three times. On #3123 two reviewers found 1 CRITICAL and 12 IMPORTANT issues including two vacuous tests, one of which passed with the guard deleted outright. On #70 a reviewer found a silent-green hole where a glob-metacharacter filename went unvalidated while the step exited 0. On #2891 a reviewer caught three em-dash-collapse meaning changes that every automated gate passed silently, then on re-review caught one "fix" that only relabelled the defect and another that introduced a new one.

    A stall test that fires on quiet workers is worse than none. Dirty-count staleness plus lease-renewal lag produced a false positive on #2891, which was running 254 tool calls over ~68 minutes with a frozen file count. Commits-ahead-of-origin/main is the better signal.

  3. kyle-sexton commented on Aug 23, 2026

    @kyle-sexton
    ContributorAuthor

    This was generated by AI during an autonomous work-loop cycle.

    Instance melo-lap-001-worker-202608231812 — lane: work-loop, machine melo-lap-001.

    Cycle 1 — 2026-08-23, started 18:12Z

    Rate limit was clear at cycle start: 61 of 5000 core requests used, 0 of 30 search.

    The frontier held 17 open agent-ready issues org-wide, all of them in claude-code-plugins. Eight were excluded as owned by sibling instances or as carrying open close-linked PRs, leaving 9 clear. This lane claimed and dispatched four — #3131, #3170, #3159 and #3160 — each with a takeover comment naming the expired lease holder MELO-LAP-001-triage-202608230449. #3158 was deferred deliberately: it rewrites the same .github/workflows/ci.yml as #3159, so the two were serialized rather than run in parallel, to avoid a self-inflicted conflict. Five items remain on the frontier after dispatch: #3158, #3149, #3137, #3184 and #3157.

    Hygiene: 13 stale worktrees pruned and 2 fully-merged local branches deleted. Four worktrees were skipped because they are held under git worktree locks reading "lane active on melo-lap-001", a live coordination signal from another lane. Their PRs are merged, so they become removable once that lane releases them.

    Open flags

    Role-label resolution is not coming from per-repo config. claude-code-plugins has a .work-item-tracker.json with no role_labels key, and so do .github, provisioning, medley, ci-workflows, ci-runner, standards and github-iac; only dotfiles declares them. This lane resolved the literals agent-ready and needs-human from the org-managed github-iac/Labels.cs instead. That works today, but it would silently miss any repo that adopts a different literal.

    Lease TTL disagrees with tracker config. Every lease marker embeds ttl_hours: 1, while the tracker configs declare lease_ttl_hours: 24. This lane treated the per-marker value as authoritative, on the reasoning that a lease which declares its own expiry governs itself and the config value is a default applied to newly minted leases. Worth reconciling so the two stop disagreeing.

    Cycles 2–13 — 2026-08-23, roughly 18:30Z–21:00Z

    Three pull requests opened and handed to the merge lane, three items yielded on collision, one duplicate resolved. This lane never merged anything.

    Findings worth recording for other lanes

    A defect in this lane's own dispatch briefs. Workers were told to release leases by posting fresh marker comments. That contradicts plugins/work-items/tools/work-item-tracker/CONTRACT.md, under which leases are edited in place and released by adding superseded_at. Invented keys such as released_at or state are silently ignored by the parser, which would leave a live-looking lease blocking other lanes until its TTL expired. Two workers caught this independently; the briefs were corrected mid-run and the affected markers fixed.

    Two lanes worked the same items concurrently. A cursor/*-cfcf lane opened PRs on items this lane had claimed and leased, and one branch was force-pushed from another surface under the same account mid-rebase. No work was lost, but tracker leases did not prevent the overlap.

    Independent review repeatedly changed substance rather than wording. It returned NOT READY on #3149's first commit, and on #3131 found the draft's central conditional false in both directions. On #3137, a panel found six defects in the canonical PR #3220 that that PR does not carry, including a tracked-mode problem that will fail an unconditional CI lane; those were posted to #3220 as a review comment.

    Two follow-up issues were filed rather than folded into unrelated PRs: #3212, where reap-project-plugin-records.sh:238 runs claude plugin uninstall without --keep-data non-interactively across every plugin id during worktree cleanup, destroying other plugins' data directories; and a note on #3137 that the config-cascade Implementers table has no completeness gate.

    Open flags

    Still open from cycle 1: claude-code-plugins declares no role_labels in its .work-item-tracker.json, so the literals agent-ready and needs-human were resolved from the org-managed github-iac/Labels.cs. Also unreconciled: lease markers embed ttl_hours: 1 while tracker configs declare lease_ttl_hours: 24.

  4. kyle-sexton commented on Aug 25, 2026

    @kyle-sexton
    ContributorAuthor

    Lane telemetry — work-loop — instance melo-desk-001-worker-202608251649 (host melo-desk-001, launched 2026-08-25T16:49Z)

    Cycle 1 (2026-08-25T17:30Z) — in flight 2/5 · PRs opened 0 · escalated 1 · yielded 0

    • Dispatched claude-code-plugins#3343 (Windows-jq CR breaks ai-slop exclusions) — took over expired lease from melo-lap-001-worker-202608231812 with a naming comment first. Worktree melodic-software-claude-code-plugins-fix-3343-cfg-array-cr, branch fix/3343-cfg-array-cr.
    • Dispatched dotfiles#552 (statusline perf, priority: high) with a residual-scope gate: merged PR dotfiles#553 already fixed the headline symptom but auto-closed nothing, so the worker must establish what actually remains before writing code. Worktree melodic-software-dotfiles-perf-552-render-spawn-cost, branch perf/statusline-render-552.
    • Escalated dotfiles#550 to the human floor — dependency pins plus two SHA-256 checksums requiring re-vet. Categorically gated, not difficulty-gated.
    • Skipped: #2891 (foreign-owned), #3342 (blocked — its prerequisite script lands in still-open PR feat(scripts): gate the de-slopped surfaces against em-dash regression #3344).

    Label resolution — coverage gap worth knowing. All 16 non-archived repos resolve to agent-ready / needs-human, but only dotfiles configures this explicitly; 8 repos have stub trackers without role_labels and 7 have no tracker at all. Resolution is therefore mostly by shipped default in lib/labels.sh, so a change to that default would silently move ~15 repos at once. The 7 tracker-less repos were only probed for agent-ready — a repo using a different label there would be invisible to this lane. Next full sweep will add one unlabeled pass over those 7.

    Lease TTL discrepancy. Tracker config says 24h, existing lease comments embed ttl_hours:1, this lane mandates 60m. Writing 60m; flagging because a 24h lease would block the other two machines for a day.

    Worktree hygiene — executed. Starting state 128 dirs / 11.2 GB: 9 protected, 5 live, 70 prunable-safe, 40 prunable-risky, 4 unknown. Pruned 22 worktrees, reclaimed 4,846 MB, worktrees only — zero branches deleted, zero dangling metadata. Held back: all claude-code-plugins and dotfiles members (in-flight worker evidence), the 21 stale-only dirs with no PR (outside this lane's merged/closed authorization), and the 40 risky + 4 unknown dirs (unpushed or dirty content — human floor).

    Three hygiene findings that generalize to anyone automating worktree pruning here:

    1. These repos squash-merge, so ancestry-vs-main is a useless prune signal — 101/128 HEADs read as "not in main" purely as artifact. Use PR state instead. For the same reason git branch -d refuses on merged branches; only -D works, which is why this lane leaves branches in place and reclaims disk from worktrees alone.
    2. gh pr list --limit 500 silently truncates on claude-code-plugins (1948 PRs) and would have mis-marked ~30 dirs as unpushed.
    3. Directory names do not imply repo. knowledge-corpus-mapper is a claude-code-plugins worktree; the ccp-* prefix covers both claude-code-plugins and claude-code-proxy. Attribute by repo from git metadata, never by name prefix — this is a live false-skip and false-prune hazard.

    Also noted: 4 protected base clones (g-base, gr-base, lane-v161-base, lane-l-mut) are dirty, which contaminates anything branched from them. lane-v161-decoy appears to be a deliberate test fixture and was left untouched.

    1. git worktree remove can leave a residual directory holding an ignored symlink. 8 claude-code-proxy worktree dirs survive as empty shells containing only a .venv symlink into the shared venv at the main clone. Git removed everything it owned; the ignored link blocked the rmdir. They cost 0 MB and are left in place deliberately. Do not clean them with PowerShell Remove-Item -Recurse — it has historically followed directory symlinks/junctions and would delete through the link into the live shared venv the main clone still uses. Safe form is to unlink the symlink itself first, then remove the empty parent.

    Gate discipline used for the prune: the protected-set intersection check runs as code with an abort path, not as a human reading a list. Worth keeping — a hand-compacted prose list at one point appeared to contain a protected main clone, and only the machine-generated list disproved it.


    Cycle 10 (2026-08-25T18:40Z) — first PR handed off.

    Orchestration lesson — a liveness metric I had wrong for six cycles. I was judging worker health by directory mtime, which only changes when entries are added or removed, not when file contents change. Both workers looked stalled for ~40 minutes while actively building; I nearly reclaimed a live item, which would have produced a duplicate PR. Correct signals, in order: the agent runtime's running/idle state, then find <worktree> -type f -newermt for recent writes, then commit/push state. Long quiet windows are normal here — this repo's suites run 469 assertions in ~11 minutes.

    Cycle 13 (2026-08-25T18:53Z) — second PR handed off; both claims released. Lane idle.

    • claude-code-plugins#3343 → PR fix(ai-slop): strip the carriage return the Windows build of jq puts on every config read #3361, OPEN, close-linked (closingIssuesReferences=[3343]), verified independently. Lease superseded_at 18:53:10Z. Fix strips the CR the Windows jq build puts on every config array element; 4 files, scope confined to plugins/ai-slop/.
    • Independent review ran two rounds against withheld rationale: no blockers, five items fixed in round one, one stale-comment should-fix plus two nits in the delta round. The should-fix mattered — the comment the changelog cites as its anti-vacuous-pass guard had drifted four ways once a third reader landed.
    • Two findings surfaced by that review, both needing their own work item (triage lane owns minting them):
      1. rule_allowed_paths has shipped broken on Windows since 0.4.0 — the real Windows jq emits CRLF natively, so main's own suite already fails those cases on Git Bash with no shim at all. fix(ai-slop): strip the carriage return the Windows build of jq puts on every config read #3361 turns them green, which is a stronger claim than its changelog makes.
      2. Pre-existing Windows-only test defect at detect.test.sh:612-615: it links $(command -v printf), which returns the bare word printf for the bash builtin rather than a path, so that symlink is dangling by construction. Correctly left out of fix(ai-slop): strip the carriage return the Windows build of jq puts on every config read #3361 rather than absorbed as scope creep.

    Lane state: 0 in flight, frontier empty, 2 PRs handed to the merge lane, 1 item escalated to the human floor. Both PRs are the merge lane's from here — this lane does not monitor or merge them.

    Correction to the #3343 entry above. The salvage reconnaissance I recorded described the PRE-REBASE state (0.3.9 → 0.3.10, two readers). The shipped change is 0.4.0 → 0.4.1 and three readers. Main advanced to 363564299 mid-flight, the worker rebased, and the rebase surfaced a third reader carrying the same defect — rule_allowed_paths, introduced by 0.4.0. All three (cfg_array, cfg_scalar, rule_allowed_paths) are fixed in #3361. Measured on Windows: unmodified main fails 7/155 cases, the branch fails 2/163, and those 2 also fail on main. This was scope growth, and it was correct — the rebase revealed the defect had spread, so fixing only the two known readers would have shipped a knowingly incomplete fix.

    Generalizable: a mid-flight rebase can change what the correct fix is, not just how it merges. Re-derive scope after rebasing rather than assuming the pre-rebase artifact still matches the item.

    Hygiene final (cycle 13). Running total: 45 worktrees removed, 5,424 MB reclaimed, 0 branches deleted, 0 dangling metadata. Directory count 128 → 93. Both live PR worktrees untouched.

    New standing rule — git worktree LOCK state is a first-class ownership signal for this lane, ranked ABOVE PR state. A lock is the only signal in the whole scan that a lane places deliberately; mtime, dirty-state, and PR status are all inferred. The original classification pass never captured lock state at all. It caused no damage — worktree remove refuses a locked tree, and all 22 removals in the prior pass returned rc=0 — but it was invisible, which is worse than known-absent.

    4 locked worktrees left intact (140 MB, all claude-code-plugins: fix-2599-skill-grammar-restore, fix-2648-tzdata-degradation, fix-2659-typos-multi-candidate, fix-f2-merged-protected-branch). Lock text, written by this org's own worktree tooling: "lane active on melo-desk-001 since 2026-08-15…; unlock when the owning lane is done." Ten days stale, so almost certainly orphaned by lanes that died without unlocking — but overriding a deliberate marker on "almost certainly," to reclaim 140 MB after 5.4 GB was already freed, is negative expected value. Escalated to the human floor; unlocking is theirs to authorize.

    Scan-scope hole recorded: at least one locked worktree lives outside D:\worktrees — …\github-iac\.claude\worktrees\feat+176-work-class-label-axis, whose lock names a pid that is no longer running. Any future hygiene pass should enumerate worktrees from each repo's registry rather than by scanning one directory.

    Also adopted permanently: verify a worktree is still on its recorded branch before trusting a PR-derived MERGED verdict. A retired worker reusing a directory on a different branch would otherwise make a stale verdict look valid.

    Cycle 14 (2026-08-25T19:25Z) — frontier effectively empty; nothing claimed. 0 in flight.

    All 16 repos swept via core API, 0 gh search calls. Four open agent-ready issues org-wide, zero new since cycle 2.

    Process note for future cycles: #3359 was this lane's cycle-2/4 justification for calling #2891 foreign-owned, and it merged mid-session at 17:57Z. The merge lane moves state underneath this one, so an exclusion recorded in an earlier cycle must be re-derived, never carried forward. Scouts should explicitly report merge events for any PR a prior cycle cited as a collision.

  5. kyle-sexton commented on Sep 5, 2026

    @kyle-sexton
    ContributorAuthor

    Lane telemetry — work-loop — instance vm-worker-202609050257

    Cycle 1 · 2026-09-05T03:15Z

    metric value
    in flight 2 of 5
    PRs opened 0 (2 workers active)
    escalated 1 (config gap, to human)
    yielded 0
    frontier remaining 14

    Claimed this cycle: #3507 (block-hook-bypass.sh fail-closed on Windows stdin stall), #3505 (skill listing budget). Leases expire 2026-09-05T04:15:00Z.

    Why 2 and not the 3–5 cap: all 16 frontier candidates converge on the synced hook-utils.sh (17 copies propagated by scripts/sync-hook-utils.sh). Parallel pickup of more than one perf shard would collide. #3507 and #3505 are the only two non-colliding surfaces. Remaining perf shards (#3509–#3521, #3529, #3508) stay queued behind #3507.

    Blocking finding — tracker config gap. 14 of 15 org repos cannot resolve role_labels from .work-item-tracker.json: 7 are stub files sharing one SHA (only schema_version, provider, config.lease_ttl_hours), 7 are absent entirely (knowledge-corpus additionally has no agent-ready label at all). Every claim this cycle therefore rests on a default label resolution, not on config. The shared SHA across the 7 stubs points at one template predating role_labels.

    Environment deviations recorded for other instances: no gh CLI on this host (GitHub MCP tools only); CLAUDE_CODE_MAX_SUBAGENT_SPAWN_DEPTH=1, so workers cannot spawn their own helpers — skills run inline in the worker context and the independent reviewer is dispatched as a sibling agent by the orchestrator instead of nesting under the producer.

    Skipped (foreign ownership): #2891 (assigned + branch claude/2891-deslop-shard6), #3516 (comment declares fix in flight on perf/disk-hygiene-guard-hook-spawns).


    Generated by Claude Code

  6. kyle-sexton commented on Sep 5, 2026

    @kyle-sexton
    ContributorAuthor

    Lane telemetry — work-loop — instance vm-worker-202609050257

    Cycle 2 · 2026-09-05T04:10Z

    metric value
    in flight 0 of 5
    PRs opened 1 (#3740, draft)
    escalated 2 (#3505, #3507)
    yielded 0
    frontier remaining 14 — all blocked

    #3507 → draft PR #3740, escalated. Root cause correctly diagnosed and cleanly built (sync parity byte-identical across 17 copies, scope gate-mandated, revert-detecting test verified, validation claims independently confirmed). Escalated because the chosen fix introduces a fail-open path that skips every guard behind run-guards.sh, with no telemetry on the wired path and no retry cap. Two independent reviewers agreed on all facts and split on the verdict — that split is the escalation trigger, not a fact dispute.

    #3505 escalated — fleet-wide description convention would supersede ratified ADR 0004 D-3 and native-references; also owned by #3526, which gates on a missing eval baseline.

    Frontier is 14 but effectively 0 dispatchable. Every remaining item (#3508–#3521, #3529) is a Windows hook-performance shard converging on the synced lib/hook-utils.sh — the same file #3740 modifies and the same file the pending human decision governs. Dispatching a shard now would branch from a base that excludes #3740 and knowingly manufacture merge conflicts on a file whose shape is undecided. This lane is holding rather than generating conflicting work.

    Unblocks when: the #3507 security tradeoff is decided (narrow / harden / accept). That decision also settles what shape the shards build against.

    Labeling defect found this cycle: #3505 carried both agent-ready and work-class: structural. Those contradict — structural is human-floor by definition. Any item holding both is claimed then escalated by every lane instance in turn. Worth a tracker rule making the pair impossible. #3507 by contrast was correctly labeled work-class: scoped; its escalation came from the fix approach, not from mis-triage.


    Generated by Claude Code

  7. kyle-sexton commented on Sep 5, 2026

    @kyle-sexton
    ContributorAuthor

    Correction — instance vm-worker-202609050257

    My two earlier telemetry comments this session reported a "tracker config gap: 14 of 15 repos cannot resolve role_labels." That finding was wrong. Correcting it here so the durable record does not mislead the next instance.

    What is actually true. Absent role_labels entries fall back to shipped defaults silently by design. reference/label-taxonomy.md specifies that behavior, and /work-items:setup deliberately omits entries that keep their default, writing minimum-viable config only. Sourcing binding.sh against a stub config and against a fully-specified one resolves the identical trio (agent-ready / needs-human / recurring, plus work-map).

    So the seven byte-identical stubs are conforming, not drifted. dotfiles is the redundant outlier, not the reference shape. Adding role_labels to the seven would have been a no-op that created a second definition site for values the taxonomy already owns. No tracker file was edited.

    Two further corrections to my earlier reports:

    • knowledge-corpus lacking agent-ready is by design, not an oversight — HasIssues = false, ManagedLabels: false, described as an artifact store whose work is tracked in medley. It should get neither the label nor a binding.
    • The seam is central and lives entirely in plugins/work-items/tools/work-item-tracker/. There is no propagation mechanism for .work-item-tracker.json; github-iac governs repository settings and labels, not repo file content.

    The second defect was real and is fixed. C4/C5 are human-gated in both the admission-gate table and the autonomy shipped defaults, but wit_filter_frontier dropped only the human-gated role label. An agent-ready + work-class: structural item was therefore frontier-available, and would be claimed, escalated and released once per lane instance. Reproduced against the live function before the change and confirmed absent after. Floored in lib/frontier.sh under --autonomous only, so attended lanes still see those items, with C3 left to the admission gate. Draft PR #3745, under independent review.

    On the #3505 evidence. The tracker worker observed #3505 carrying work-class: scoped and concluded it does not evidence the incident. Both readings are right: #3505 did carry agent-ready + work-class: structural when this lane first claimed it — that is what surfaced the defect — and I relabeled it to scoped later, after the owner narrowed its scope to a configuration change. The incident was real; the label moved because this lane moved it.


    Generated by Claude Code

  8. kyle-sexton commented on Sep 6, 2026

    @kyle-sexton
    ContributorAuthor

    Lane telemetry — work-loop — instance vm-worker-202609050257

    Cycle 8 · 2026-09-06T06:55Z

    metric value
    in flight 2 of 5
    PRs opened this session 6 (all open, none merged)
    escalated 0 outstanding
    yielded 0
    frontier 1 dispatchable, 17 blocked

    The lane is effectively drained. Not because the backlog is empty, but because everything left collides with something in flight. Honest count of implementable work right now: zero. The one dispatchable item (#3516) is verify-and-close, not implementation.

    Dependency graph of what is blocked

    Blocked On
    #3513, #3517, #3519, #3521 PR #3740 → lib/hook-utils.sh (hook::buffer_stdin); #3513 is block-hook-bypass.sh, #3740's own file
    #3509, #3510, #3511, #3512, #3514, #3515, #3518, #3529 PR #3740 and PR #3788 → their exact hook files
    #3348, #3349, #3351 PR #3783 → hygiene.py + destructive_guard.py; all three converge there
    #2891 assigned, live branch claude/2891-deslop-shard6
    dotfiles#646 PR #651 → consumes the (host, lane) verdict contract it defines

    All twelve campaign shards call hook::buffer_stdin directly, verified by grep on main. #3516 is the only campaign child that does not, which is why it was independently addressable.

    PRs from this lane, for the merge lane's awareness

    All six are open, none merged, and all five claude-code-plugins PRs went dirty overnight against roughly 15 commits main took. Three carry bot review threads with no reply yet: #3779 (claude), #3783 (codex P2 x2), dotfiles#651 (codex P2). #3740 and #3779 also have ci-lanes failures on lane 2/4.

    Per the lane owner's instruction, this lane hands off at an open review-ready PR and does not babysit; recording the state so it is not mistaken for finished.

    Overlap warning — a second lane is covering most of this campaign

    PR #3788 (cursor/bash-hook-spawn-hotpath-c0dc, updated 06:43Z, active) changes 68 files across 17 plugins, including the exact hook files of #3509, #3510, #3511, #3512, #3514, #3515, #3518 and #3529, plus guardrails/hooks/run-guards.sh — the dispatcher every guardrails shard sources. It does not touch lib/hook-utils.sh. It may make several shards moot. Anyone planning the campaign should reconcile against it before dispatching more shard work.

    Also untriaged: #3504 proposes a further hook-utils.sh change (a shared bounded-drain helper) and names block-windows-drive-tmp.sh (#3517) as its file — a third writer to the same contended file.

    Concurrency after the fences clear


    Generated by Claude Code

  9. kyle-sexton commented on Sep 6, 2026

    @kyle-sexton
    ContributorAuthor

    Lane telemetry — work-loop — instance vm-worker-202609050257

    Final cycle · 2026-09-06T09:05Z · lane blocked

    metric value
    PRs opened, reviewed, handed off 10 across 2 repos
    resolved to human floor 2 (#3505, #3507, both later unblocked and shipped)
    escalations outstanding 0
    yielded 0
    leases held 0
    frontier 0 startable, 27 blocked

    Finding worth acting on: blocking edges are invisible to machine reads

    Two scouts disagreed about whether the #3799-#3803 epic children were startable. The disagreement resolved decisively, and the reason matters more than the answer.

    Blocking edges in this decomposition are declared as prose in the issue body (a ## Blocked by section naming an issue number), not as native GitHub relationships. Verified on two samples: #3814's body says ## Blocked by #3805, and #3824's says ## Blocked by #3821. Both return has_parent: true pointing only at the epic, has_children: false, and nothing in any native blocked-by field.

    So a scout reading native relationships reports "no blocking issue" and a lane dispatches straight into work whose prerequisite has not been done. That is the same failure class as the list-sub-items defect fixed in #3830: a machine read that returns empty is indistinguishable from a machine read that is looking in the wrong place.

    Any lane resolving blocking edges must parse the issue body. Worth encoding in the tracker rather than leaving to each scout's judgment.

    Why the lane is blocked

    Blocked On Nature
    #3814-#3819 #3805-#3809 Five needs-human, work-class: read-only planning slices. Human floor.
    #3821, #3822 #3814 Transitively behind the same five
    #3823 #3822 Transitively
    #3824 #3821 Transitively
    #3509-#3521, #3529 PR #3740 (dirty, CI red) lib/hook-utils.sh / hook::buffer_stdin
    #3348, #3349, #3351 PR #3783 hygiene.py + destructive_guard.py
    dotfiles#646 PR #651 Consumes the (host, lane) verdict contract
    #2891 assigned + live branch Foreign-owned
    #3508 work-class: structural Human floor by definition

    The five planning slices are the unlock. They gate ten items directly or transitively, and nothing this lane can do moves them.

    PRs handed off, none merged

    claude-code-plugins #3740, #3745, #3767, #3779, #3783, #3828, #3830, #3831 · dotfiles #651, #659.

    Four are dirty against a main that moved ~15 commits overnight; #3740, #3779 and dotfiles#651 have ci-lanes failures. Per the lane owner's instruction these belong to the merge lane; recorded so the state is not mistaken for finished.

    #3832 is still open — another session's duplicate of #3830, same defect, same approach, same base SHA, conflicting on all three files. #3830 is canonical by lowest-number convention, but that is a tiebreak and the owner's to overrule.

    Multi-instance note

    Four concurrent-write events on this lane's branches today, including one full duplicate PR and one identical SC2154 fix authored twice. An open close-linked PR is meant to be a hard skip signal; something running alongside this lane is not honoring it.


    Generated by Claude Code

  10. kyle-sexton commented on Sep 27, 2026

    @kyle-sexton
    ContributorAuthor

    lane: work-loop
    instance: melo-desk-001-wsl-dry
    cycle: 1 (single-cycle permission dry run; loop not armed, no ScheduleWakeup)
    guard: proactive (five_hour 2%, seven_day 9%, snapshot fresh)

    Snapshot: 283 open frontier items (seam list-frontier), 56 carrying needs-triage, about 130 agent-ready and unassigned.

    Intake sweep: held. It would have mutated up to 56 issues; the operator's bulk-mutation rule requires confirmation for unattended multi-target runs. Nothing was triaged.

    Admission: cap 2, oldest-first over C1/C2. Admitted #3544 (C2 mechanical) and #3724 (C1 read-only). No path/topic hard gate hit. C3 ratification queuing was held for the same bulk-mutation reason; nothing was labeled or commented. Unclassified and C4 agent-ready items (#3568, #3934, and the structural set) were left untouched.

    Execute:

    Escalations: none filed.
    Outcome: 2 clean, 0 dirty. The no-progress streak resets.

    {"schema":"work-items/loop-state@2","cycle":1,"clean_streak":2,"no_progress_streak":0,"item_cap":2,"rate_limit_latch":false,"first_drain_complete":false,"guard_mode":"proactive","stop_mode":"standing","ordering":"oldest-first","shard":null,"scope":null,"lane_instance":"melo-desk-001-wsl-dry","writer_nonce":"9fc77cac","heartbeat_at":"2026-09-27T06:29:43Z","paused_until":null,"loop_started_at":"2026-09-27T06:22:37Z","restart_request":null,"usage_sample":{"at":"2026-09-27T06:22:37Z","five_hour_pct":2,"seven_day_pct":9,"five_hour_delta_pct":null}}
  11. kyle-sexton commented on Sep 27, 2026

    @kyle-sexton
    ContributorAuthor

    Cycle 4, 2026-09-27T19:30Z to 19:36Z. lane: work-loop
    instance: melo-lap-001-wsl-1

    Headline: the operator ratified #3351, #3711, #3713, #3720, and #3843 via attend-queue at 19:06Z.

    Two lanes, one identity, one ordering: melo-lap-001-wsl-1 and melo-lap-001-wsl-3 both run oldest-first on this repo under kyle-sexton.

    • Execution is arbitrated by lease-comment order (claim.sh), and it worked here.
    • Triage and C3 queueing take no claim. A cross-check found no duplicate triage or markers so far, but concurrent cycles can collide.
    • Operator decision: stop one instance, or split them with --shard 0/2 and --shard 1/2.

    Guard: proactive, 5h 7%, 7d 35%.

    Discipline sweep: 4 core correctors, canary verified, all ledgers proven. The forks cost about 352K to 359K tokens each (per-fork usage lines; the cycle total is an estimate of about 1.4M). The situational tier was skipped because none of its triggers was in flight. No in-tree corrections. Earlier figures, the ~1.3M per cycle and 0 to 7% over 45 minutes, are estimates from summed usage lines and single tee reads.

    Executed: none. Intake and queue: not run this cycle, to avoid colliding with wsl-3, which is triaging the same oldest-first frontier.
    No-progress streak: 1. Actionable intake was in view and none was advanced.

    {"schema":"work-items/loop-state@2","cycle":4,"clean_streak":0,"no_progress_streak":1,"item_cap":3,"rate_limit_latch":false,"first_drain_complete":false,"guard_mode":"proactive","stop_mode":"standing","ordering":"oldest-first","shard":null,"scope":null,"lane_instance":"melo-lap-001-wsl-1","writer_nonce":"a47479ec","heartbeat_at":"2026-09-27T19:36:00Z","paused_until":null,"loop_started_at":"2026-09-27T18:12:43Z","restart_request":null,"usage_sample":{"at":"2026-09-27T19:30:05Z","five_hour_pct":7,"seven_day_pct":35,"five_hour_delta_pct":3}}
  12. kyle-sexton commented on Sep 27, 2026

    @kyle-sexton
    ContributorAuthor

    Cycle 4, 2026-09-27T19:40Z to 19:44Z. lane: work-loop
    instance: melo-lap-001-wsl-2

    Config unchanged. Guard: proactive, 5h 10%, 7d 36% (tee captured 19:40:30Z). The checkout is 0 behind origin/main.

    Discipline sweep: full batch over the 4 core correctors after a verified canary. No in-tree corrections. Process corrections:

    Blocked: the ratified items cannot be claimed. A fresh claim on #4597 still exits 7 against lease comment 5858854887. Per CONTRACT.md:174, ttl_minutes adds to ttl_hours, so the attend-queue row-claim leases last 24h30m. That blocks #4597, #4595 and #4346 until about 19:36–19:44Z on 09-28, unless the lease is released. Evidence and the correction were posted on #4609 (human-gated, proposed C4).

    Intake (5 newest):

    Admission:

    Executed: none (lease-blocked).

    Unstamped (briefed, no work-class:): #4600, #4601, #4602, #4603, #4604, #4606, #4607. Proposed C3 for all.

    {"schema":"work-items/loop-state@2","cycle":4,"clean_streak":0,"no_progress_streak":0,"item_cap":2,"rate_limit_latch":false,"first_drain_complete":false,"guard_mode":"proactive","stop_mode":"standing","ordering":"newest-first","shard":null,"scope":null,"lane_instance":"melo-lap-001-wsl-2","writer_nonce":"225547f4","heartbeat_at":"2026-09-27T19:44:17Z","paused_until":null,"loop_started_at":"2026-09-27T18:28:31Z","restart_request":null,"usage_sample":{"at":"2026-09-27T19:40:40Z","five_hour_pct":10,"seven_day_pct":36,"five_hour_delta_pct":3}}
  13. kyle-sexton commented on Sep 27, 2026

    @kyle-sexton
    ContributorAuthor

    Cycle 2, 2026-09-27T19:22Z to 19:47Z. lane: work-loop
    instance: melo-lap-001-wsl-3

    Config is unchanged from cycle 1. The guard is proactive: the tee was read at 19:22:06Z (captured 19:21:57Z), 5h 7%, 7d 35%. The lane checkout is e509cb7b2; origin/main is at ecbcdc55e. Nothing under plugins/work-items/ differs between the two.

    Discipline sweep. Canary verified; the 4 core correctors ran in one wave, and all four ledgers proved inheritance. The situational correctors were skipped for the same reason as cycle 1. Measured cost: each fork used about 250K tokens, about 1.25M for the pass. No in-tree corrections. Process corrections applied this cycle:

    Snapshot. list-frontier returned 184 items: 99 agent-ready, 63 needs-triage.

    Execute: 0. The operator ratified or handed to the lanes about 12 C3 items between 19:06 and 19:21Z. Claims on #3351, #3526, #3589, #3614, #3711, #3713, #3720, and #3860 all exited 7.

    Intake (4 triaged; #4403-#4406 were left to wsl-1):

    Admission:

    Unstamped: #4399, #4400, #4401, #4436, #4437, #4438.

    Unverified: the #3951 and #3955 comment bodies come from the worker's result file; the labels were re-read.

    {"schema":"work-items/loop-state@2","cycle":2,"clean_streak":0,"no_progress_streak":0,"item_cap":2,"rate_limit_latch":false,"first_drain_complete":false,"guard_mode":"proactive","stop_mode":"standing","ordering":"oldest-first","shard":null,"scope":null,"lane_instance":"melo-lap-001-wsl-3","writer_nonce":"47ceaa67","heartbeat_at":"2026-09-27T19:47:00Z","paused_until":null,"loop_started_at":"2026-09-27T18:54:11Z","restart_request":null,"usage_sample":{"at":"2026-09-27T19:22:06Z","five_hour_pct":7,"seven_day_pct":35,"five_hour_delta_pct":3}}
  14. kyle-sexton commented on Oct 4, 2026

    @kyle-sexton
    ContributorAuthor

    work-loop STOPPED on operator request, 2026-10-04T13:20Z (clean stop).
    lane: work-loop
    instance: melo-worker-1

    Outcome:

    Left in flight: #6223 (closes #6183) is ready, CLEAN, and ci-status green. The merge lane is also stopped, so it needs a human merge or a restarted merge lane. Its worktree is kept: worktrees/melodic-software-claude-code-plugins-6183.

    Next for a relaunch:

    25 ratify-c3 items and 17 escalations wait in Attend Queue.

    {"schema":"work-items/loop-state@2","cycle":2,"clean_streak":10,"no_progress_streak":0,"item_cap":3,"rate_limit_latch":false,"first_drain_complete":false,"guard_mode":"proactive","stop_mode":"standing","ordering":"oldest-first","shard":null,"scope":null,"lane_instance":"melo-worker-1","writer_nonce":"5c22acab","heartbeat_at":"2026-10-04T13:20:00Z","paused_until":null,"latched_account":null,"effort":"medium","loop_started_at":"2026-10-04T05:19:59Z","restart_request":{"reason":"operator clean stop","at":"2026-10-04T13:20:00Z"},"usage_sample":{"at":"2026-10-04T13:12:09Z","five_hour_pct":18,"seven_day_pct":68,"five_hour_delta_pct":5}}
  15. kyle-sexton commented on Oct 4, 2026

    @kyle-sexton
    ContributorAuthor

    This was generated by AI during work-loop.

    Closed on the operator's request at the work-loop lane's clean stop (instance melo-worker-1). The final state block above records the outcome and the relaunch queue. A relaunched work-loop lane recreates or reopens this tracking issue through the seam.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs-triageNot yet classified. Floor until a type and one priority tier are set.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions