Skip to content

loop-lane telemetry: move durable state off permanently-open Issues to a GitHub Discussion (storage-mechanism reconsideration) #1250

Description

@kyle-sexton

Filed by AI on operator direction (attended session, 2026-07-24). Research verified empirically — see Evidence below.

Category: design · Source: operator observation during a live work-items:work-loop cycle, 2026-07-24

Problem

The loop-lane telemetry contract (convention §4, "Telemetry comment (#502)") stores each lane's durable state on a permanently-open GitHub Issue (Lane telemetry: <lane>), one per lane, carrying a single sentinel-marked comment edited in place.

The operator flagged this as a design smell while watching a lane run: the telemetry issues are permanent non-work items squatting in the real Issues backlog with no cleanup path. They are excluded from every drain/frontier evaluation by title contract, but they still appear in the default Issues view forever, and their open state — the signal a human reads as "this is outstanding work" — means the opposite here ("this lane is operating"). Three exist today: #1248 (work-loop), #1214 (babysit-loop), #1198 (attend-queue), and the count grows linearly with lanes.

This is a storage-mechanism problem, distinct from #1221, which fixes only how cycle reports describe the existing surface (correct artifact noun, standing convention anchor). #1221 makes the current design legible; this issue reconsiders whether it is the right surface at all.

Direction

Move loop-lane telemetry from a permanently-open Issue to a categorized GitHub Discussion, keeping the existing single-sentinel-comment-edited-in-place design, driven via gh api graphql.

Rationale (all empirically verified, see Evidence):

  • Discussions is the only candidate that keeps the human-repliable, notified, edit-in-place comment thread the ratification workflow depends on while moving the object entirely off the Issues backlog — Discussions is a separate GitHub surface/tab, not a filtered Issues view.
  • Headless reliability equals Issues provided automation targets the stable GraphQL mutations (createDiscussion, addDiscussionComment, updateDiscussionComment) rather than the gh discussion CLI porcelain, which the shipped binary and its upstream source both mark preview, "subject to change without notice" (added 2026-06-10). This requires no new habit: the lanes already bypass porcelain for raw gh api PATCH.
  • markDiscussionCommentAsAnswer is a genuine gain — a native "this reply is ratified" primitive with no Issues equivalent, directly useful to the kind=ratify-c3 flow in /work-items:attend-queue.

Explicitly rejected framings:

  • Pinning is a red herring — capped and web-UI-only on both surfaces (Discussions 4/repo and 4/category; Issues 3/repo), with no pin mutation in the GraphQL schema. Lanes must be found by title/category search, exactly as the status quo finds its Issue today.
  • "Issues are wrong for automation" is too broad — GitHub's own IssueOps engineering blog blesses Issue-driven automation. The real, narrower defect is a never-closable Issue in the default backlog view, which Discussions fixes by being a separate surface.

Rejected alternatives: Actions/repo configuration variables (no comment/reply/notification mechanism at all — disqualifying alone, despite generous 48 KB/variable, 500/repo limits); Gist (flat comments, repo-indirection, no offsetting gain); bare git-tracked state branch (best audit trail of the five, but no reply channel).

Deferred, not excluded: a Discussion + git-tracked-branch hybrid, if a truly diffable audit trail ever becomes a hard requirement. It is not one today — and note neither Issue-comment nor Discussion-comment edit history is exposed via any API, so the status quo has no audit trail either. Trigger: a requirement for value-level state diffs.

Blast radius

  • docs/conventions/loop-lane/README.md §4 — the telemetry contract is the owning surface; the tracking-item shape and the Lane telemetry: <lane> title contract change here.
  • Three lane SKILL.md bodies carrying the inlined upsert (an installed plugin cannot invoke a sibling plugin's script, so each inlines it): work-items/work-loop, work-items/attend-queue, source-control/babysit-loop. All three inline the same gh api REST comment upsert and all three must move to the GraphQL mutation shape together — the marker/sentinel contract is byte-shared across lanes.
  • claude-ops lanes/scripts/telemetry-upsert.sh (canonical interim home of the contract) and its .test.sh.
  • claude-ops morning-brief/scripts/morning-brief.sh — the compatible reader of the same surface; a writer-only migration silently breaks the brief.
  • Non-GitHub providers: the contract already degrades to "carry telemetry in the lane's cycle report" when the bound provider is not github. Discussions narrows the GitHub-native path further (Discussions is a GitHub-only concept with no REST API), so the degradation clause needs a re-read, not just a copy.
  • github-iachas_discussions is a repository setting; per the operator's standing convention it is a Pulumi-managed change in the relevant github-iac repo, never a runtime gh repo edit call embedded in a plugin. Currently disabled on all 14 sampled melodic-software repos.
  • Migration of the three existing telemetry issues (Lane telemetry: work-loop #1248, Lane telemetry: babysit-loop #1214, Lane telemetry: attend-queue #1198) — content moves; the issues close with a pointer.

Sequencing constraint

The IaC enablement lands first (repos cannot host a Discussion until has_discussions is true), and the reader (morning-brief) must handle both surfaces during the transition, or be cut over in the same change as the writers.

Evidence

Research run 2026-07-24 via the discovery:research protocol — 5+ distinct tool types including live gh api graphql mutations against a throwaway personal repo (full create → comment → edit-in-place → delete round-trip), gh CLI --help capture, upstream cli/cli source fetched via gh api repo-contents, and direct fetches of docs.github.com. Outcome gate passed on all 8 binary criteria. Full evidence table, per-claim source tiers, conflicts, and gaps:

Posted in full on this issue: research evidence comment. It was produced as a machine-local memory-tier artifact, so it is reproduced here to keep the evidence durable and reviewable rather than tied to one workstation.

Open verification gaps carried forward:

  1. All empirical CRUD testing ran against a personal-account repo, not an org repo — verify the same mutations against an actual melodic-software org repo before rollout.
  2. Untested whether an org-level policy can block enabling Discussions for member repos.

Relations

Activity

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-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.priority: highSignificant impact, or blocks an imminent release; staff this cycle.

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions