You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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-opslanes/scripts/telemetry-upsert.sh (canonical interim home of the contract) and its .test.sh.
claude-opsmorning-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-iac — has_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.
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:
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.
Untested whether an org-level policy can block enabling Discussions for member repos.
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-loopcycle, 2026-07-24Problem
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):
createDiscussion,addDiscussionComment,updateDiscussionComment) rather than thegh discussionCLI 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 rawgh apiPATCH.markDiscussionCommentAsAnsweris a genuine gain — a native "this reply is ratified" primitive with no Issues equivalent, directly useful to thekind=ratify-c3flow in/work-items:attend-queue.Explicitly rejected framings:
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 theLane telemetry: <lane>title contract change here.SKILL.mdbodies 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 samegh apiREST comment upsert and all three must move to the GraphQL mutation shape together — the marker/sentinel contract is byte-shared across lanes.claude-opslanes/scripts/telemetry-upsert.sh(canonical interim home of the contract) and its.test.sh.claude-opsmorning-brief/scripts/morning-brief.sh— the compatible reader of the same surface; a writer-only migration silently breaks the brief.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-iac—has_discussionsis a repository setting; per the operator's standing convention it is a Pulumi-managed change in the relevantgithub-iacrepo, never a runtimegh repo editcall embedded in a plugin. Currently disabled on all 14 sampledmelodic-softwarerepos.Sequencing constraint
The IaC enablement lands first (repos cannot host a Discussion until
has_discussionsis 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:researchprotocol — 5+ distinct tool types including livegh api graphqlmutations against a throwaway personal repo (full create → comment → edit-in-place → delete round-trip),ghCLI--helpcapture, upstreamcli/clisource fetched viagh apirepo-contents, and direct fetches ofdocs.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:
melodic-softwareorg repo before rollout.Relations