LearnNewsExamplesServices
Frontmatter
id10214
titleAgent operational hygiene: assignment protocols, labels, and inbound channels
stateClosed
labels
epicaiarchitecture
assignees[]
createdAtApr 22, 2026, 11:51 PM
updatedAtJun 7, 2026, 7:20 PM
githubUrlhttps://github.com/neomjs/neo/issues/10214
authorneo-opus-ada
commentsCount4
parentIssuenull
subIssues
10215 Codify 7-day reassignment rule in ticket-intake §3a
10216 Maintainer-side label triage workflow for contributor tickets
10217 Add PR reviewer-request MCP tool surface
10218 Enrich github-workflow healthcheck with notificationPreview
10219 Sandman active detector: stale assignments + recent open PRs
subIssuesCompleted5
subIssuesTotal5
blockedBy[]
blocking[]
closedAtJun 5, 2026, 7:08 PM

Agent operational hygiene: assignment protocols, labels, and inbound channels

Closed v13.0.0/archive-v13-0-0-chunk-5 epicaiarchitecture
neo-opus-ada
neo-opus-ada commented on Apr 22, 2026, 11:51 PM

Context

Today's session (2026-04-22) surfaced three operational-hygiene gaps that aren't yet codified:

  1. Assignment disciplineticket-intake skill blocks on branch-creation but not on existing-assignee collision. The repo's CONTRIBUTING.md specifies a 7-day no-feedback re-assignment rule, but no skill enforces it.
  2. Label authority — maintainers (currently @neo-opus-ada + @neo-gemini-pro) can set labels via manage_issue_labels; non-maintainer contributors / agents cannot. The social contract for what happens when an unlabeled contributor ticket arrives is not codified.
  3. Inbound-from-external silence — agents have GitHub accounts and receive @mention notifications, but no skill or tool surfaces inbound-from-external-world signal. #10139's memory-core mailbox covers internal A2A; GitHub @mentions cover the external channel. No bridge exists.

These compound under rapid merge tempo (see #10208, #10212 for the parallel "velocity-sensitive hygiene conventions" pattern).

The Problem

Five concrete operational pain points:

  1. An agent could grab a ticket assigned to another agent without noticing (ticket-intake doesn't check existing assignment).
  2. The 7-day reassignment grace period exists in CONTRIBUTING.md but has no enforcement substrate in the agent skills.
  3. A contributor files a ticket without labels — no agent-facing workflow covers the maintainer-side triage (apply labels, confirm scope, assign if appropriate).
  4. A human or external agent @mentions an agent in a PR/ticket comment — the mention lands in GH's notification feed, but the agent has no consistent primitive to discover it.
  5. Cross-family review mandate (#10208) currently relies on reviewer self-initiative — no formal review-request invitation mechanism leveraging GitHub's native requested_reviewers API.

The Architectural Reality

Enforcement sites + primitive candidates:

  • .agent/skills/ticket-intake/references/ticket-intake-workflow.md §3a — Claim Ownership step; extend to block on existing assignee + formalize 7-day exception.
  • New ticket-triage skill OR ticket-intake extension — maintainer-side workflow for labeling unlabeled contributor tickets.
  • GitHub requested_reviewers API — extend manage_issue_assignees (or sibling manage_pr_reviewers) to cover PR reviewer invitations.
  • github-workflow MCP server healthcheck — enrich response with notificationPreview: {unreadMentionsCount, latestMention} mirroring memory-core's existing mailboxPreview shape. Passive signal on every boot-time healthcheck; zero new polling discipline.
  • Noise discipline — GitHub notifications fire on any subscription activity (authoring, commenting, cross-ref, merging). Default filter MUST be reason=mention (authoritative "someone wants you"); assign + review_requested are opt-in expansions. Excluded by default: author, comment, subscribed, manual.
  • Sandman / Dream Pipeline substrate (tied to #10030) — active stale-assignment detector could surface via the same pipeline that builds sandman_handoff.md.

The Fix

Five sub-tickets, each independently pick-uppable:

Sub 1: Ticket-intake 7-day assignment rule

  • Extend ticket-intake §3a Claim Ownership to check existing assignees field before manage_issue_assignees add @me.
  • If already assigned to different identity: block pickup; require comment-request OR 7-day-no-feedback reassignment.
  • "Feedback" definition: any comment from the current assignee OR any maintainer comment acknowledging in-progress work. Random observer comments do NOT reset the clock.
  • Reassignment mechanism: self-serve after 7 days, with mandatory attribution comment: "Picking up per 7-day rule; previous assignee @X; last activity ."
  • Verifiable via: get_conversation / get_local_issue_by_id — compute now - lastAssigneeOrMaintainerActivity.

Sub 2: Maintainer vs contributor label workflow

  • Codify the social contract for unlabeled contributor-authored tickets.
  • Natural substrate: either extend ticket-intake with a "triage-on-intake" branch OR new ticket-triage skill (maintainer-facing).
  • Contributor can: file ticket, request assignment via comment, see what's available.
  • Maintainer responsibility: apply ai-or-equivalent-provenance label, primary label (bug/enhancement/epic), secondary labels, assign if appropriate.

Sub 3: GitHub PR reviewer-request MCP tool

  • New or extended MCP tool surface for gh pr edit --add-reviewer <login> (GitHub's requested_reviewers API).
  • Integration with pull-request §6.1 cross-family mandate: if no cross-family reviewer has engaged ~2 hours after open, author formally requests review from the opposite family.
  • Review-request is the invitation mechanism; cross-family mandate is the validation mechanism. They pair, don't overlap.

Sub 4: GitHub notifications via healthcheck enrichment

  • Extend github-workflow MCP server's healthcheck response with:
{
  "notificationPreview": {
    "unreadMentionsCount": 3,
    "latestMention": { "repo": "...", "url": "...", "title": "...", "mentionedBy": "..." }
  }
}
  • Mirrors memory-core's existing mailboxPreview pattern — passive signal surfaced on every boot-time call, no new polling discipline required.
  • Default filter: reason=mention only. GitHub fires notifications on any subscription-triggering activity (authoring, commenting, cross-ref, merging) — raw polling is high-noise. The mention filter is authoritative "someone specifically tagged this agent."
  • Opt-in expansion: assign (someone assigned the agent) and review_requested (someone wants the agent's review) can be added as a second tier.
  • Excluded: author, comment, subscribed, manual — all high-noise reasons.

Sub 5: Active stale-assignment detector via sandman

  • Once #10030 (Dream Pipeline) substrate is operational, DreamService includes a detector pass:
    • Scan open issues; for each with an assignee and no qualifying activity in ≥7 days, flag in the sandman_handoff.md output + optionally auto-apply status: needs-reassignment label.
  • Pairs with Sub 1: Sub 1 is passive (picks up on request); this is active (surfaces opportunities).
  • Can also include "5 most recent open PRs" listing as originally proposed — same substrate, adjacent output.

Acceptance Criteria

  • Sub 1: ticket-intake §3a codifies the existing-assignee check + 7-day rule + comment-request protocol
  • Sub 2: ticket-triage skill (or ticket-intake extension) codifies the maintainer-triage workflow for unlabeled contributor tickets
  • Sub 3: MCP tool surface covers PR reviewer-request; pull-request §6.1 cross-references it as the invitation mechanism
  • Sub 4: github-workflow healthcheck enriched with notificationPreview using reason=mention default filter
  • Sub 5: DreamService (post-#10030) surfaces stale-assignment candidates + recent open PRs in sandman_handoff.md

Out of Scope

  • Event-driven webhook substrate — polling via healthcheck is phase 1; webhooks require hosting and are follow-up
  • Rate-limiting agent-initiated ticket creation — YAGNI until empirical trigger observed; was considered and deferred in the brainstorm
  • Reviewer-pool rotation logic — YAGNI until third agent family added (currently Claude ↔ Gemini is the binary)
  • Extending to non-Claude / non-Gemini agent families — architecture already supports it; codification waits for adoption
  • Memory Core ↔ GitHub notification bridge (write-path from GH mention → memory-core mailbox INBOX entry) — valuable follow-up but separate surface; file as sibling ticket once Sub 4 lands

Avoided Traps

  • Standalone polling convention for notifications — rejected. Healthcheck enrichment mirrors the memory-core mailboxPreview pattern, no new discipline needed.
  • Raw GitHub notifications without filter — rejected. High noise (every merge, comment, cross-ref fires). reason=mention is the authoritative default.
  • Treat review-request as substitute for cross-family mandate — rejected. Invitation vs validation are distinct mechanisms that PAIR; neither replaces the other.
  • Active auto-reassignment without attribution — rejected. Sub 1's reassignment protocol requires a comment trail for audit.
  • Maintainer gate-keeping on contributor pickup — rejected. 7-day rule is self-serve; maintainer oversight is via post-hoc review, not pre-hoc approval. Lowers friction for contributors while preserving accountability via the attribution-comment requirement.
  • Bundling rate-limiting into this epic — deferred per YAGNI; empirical trigger hasn't surfaced.

Related

  • #10208 — cross-family PR review mandate (merged). Sub 3 (review-request) is the invitation mechanism that complements this mandate's validation requirement.
  • #10212 — pre-PR rebase mandate (in flight PR #10213). Sibling in the "velocity-sensitive hygiene conventions" cluster.
  • #10139 — Mailbox A2A primitive epic. Sub 4 covers the external-inbound channel complementary to this internal-inbound one.
  • #10030 — Dream Pipeline / sandman substrate. Sub 5 rides on this once operational.
  • #10109 — PR comment hygiene (adjacent scope in PR-workflow space).
  • CONTRIBUTING.md — source of the 7-day-reassignment rule this epic codifies into agent skills.

Handoff Retrieval Hints

  • query_raw_memories(query="agent operational hygiene assignment labels inbound channels epic")
  • query_raw_memories(query="GitHub notifications healthcheck enrichment reason mention filter")
  • query_raw_memories(query="7-day reassignment rule ticket-intake §3a")
  • query_summaries(query="swarm operational discipline sub-ticket breakdown")
  • Commit-range anchor: PR #10211 + #10213 (sibling conventions in the same hygiene cluster) + #10208 / #10212 (parent tickets)

Known contributing sessions (partial, restart-fragmented):

  • ae546a40-2133-482f-85a6-779fdf6757b2 (brainstorm + authoring session; contains the empirical rationale + Tobi's noise/healthcheck-enrichment corrections)
tobiu referenced in commit 48269c3 - "feat(ai): codify ticket-triage skill for unlabeled tickets (#10216) (#10415) on Apr 27, 2026, 1:37 PM
tobiu referenced in commit 2e1de8a - "feat(github-workflow): add manage_pr_reviewers MCP tool (#10217) (#10417) on Apr 27, 2026, 1:55 PM