Skip to content

Cross-project issue inbox: notify a repository's orchestrator about external issue activity #39

Closed

Description

@tannerpolley

Goal

Let projects talk to each other through GitHub issues. When something outside a repository's own T3 agents opens an issue, comments, or edits or closes an issue in a managed repository, that repository's orchestrator finds out. Waking it should cost almost nothing.

Example: an Amine-Thermodynamics agent opens an issue in ePC-SAFT, or comments on one. The ePC-SAFT orchestrator should notice without the owner relaying it.

Owner request and decisions (2026-10-14).

What exists

  • Writing across projects already works. In full access, agents can run gh issue create -R <other repo> and gh issue comment.
  • A background job already polls each managed repository. IssueWorkService runs repository-issue-work every 60 s and reconciles every active repository root. It lists issues in the selected milestones and admits eligible ones. It doesn't notice external comments, edits or new issues outside that admission flow.
  • T3 knows its own writes, through issue_changes and the comment receipts and effects. That lets it tell "ours" apart from "external".

Design (decided)

  • Scope: managed repositories only, meaning repositories with a repository orchestrator.
  • Watcher, with no language model:
    • Every ~2 minutes per managed repository, inside the existing scheduler, read issues and issue comments changed since a stored cursor: GET /repos/{o}/{r}/issues?since=…&state=all and /issues/comments?since=…, with ETag/conditional requests where supported.
    • Drop T3's own writes for that repository (known comment and issue ids, plus the T3 actor) and bot accounts.
  • Inbox: a fork table, one row per external event: repository, issue number, kind (issue_opened, comment, edited, closed/reopened, labeled/milestoned), author, URL, a short snippet, tagged, created time and read state.
  • Tagged: the issue has the label cross-project, or the comment or body mentions @orchestrator.
  • Delivery to the repository orchestrator:
    • Untagged events: stay in the inbox and are mentioned in one line at the orchestrator's next natural turn. They never start a turn.
    • Tagged events while the orchestrator is idle: at most one short digest message every 15 minutes, and only when new tagged events exist. For example: "2 tagged external issue events since 14:00 (epc-saft fix(web): show sidebar counts in the caret slot, caret on hover #61 comment by amine-agent, fix(web): flip the sidebar's Don't ask toggle to Ask mode #62 opened). Read them with t3_issue_inbox." It holds no bodies, to stay token-light.
    • Tagged events while the orchestrator is running: the same one-line note is delivered at the next safe point. Queue it rather than steering, because Claude's steering interrupts tools.
  • MCP tool: t3_issue_inbox (list unread, read by id, mark read), available to the repository orchestrator and its children.
  • UI:
    • an unread badge on the repository orchestrator's sidebar row;
    • an "Inbox" section on the repository's Issues page that lists events with links and marks them read.
  • Modularity: fork-owned files behind small hooks. A fork migration numbered after the current ledger.

Not in scope

Webhooks: polling is enough at this scale, and webhooks need a public endpoint. Luna triage: add it only if the rules prove noisy. Mobile. Writing to other repositories, which already works.

Done when

  • An issue or comment created in managed repository B by something other than B's own agents appears in B's inbox within a few minutes.
  • A tagged event wakes an idle B orchestrator with one short digest at most every 15 minutes.
  • Untagged events never start a turn.
  • B's own agents' writes never appear.
  • The badge and the Issues page Inbox show unread events.
  • Tests cover the filter, the cursor, digest throttling and tagging. Live GitHub is verified on a mock repository, not the owner's real ones.

Activity

  1. tannerpolley commented on Oct 14, 2026

    @tannerpolley
    OwnerAuthor

    Addendum (owner, 2026-10-14): label external issues and raise their priority.

    Why a source marker is needed. All agents write to GitHub with the owner's own gh login, so the author can't separate another project's agent, this repository's own agents, or the owner. Cross-project writes therefore carry a source marker.

    • Writing. A new MCP tool, t3_issue_post, creates an issue or comment in any repository.
      • When the target differs from the calling thread's project, it adds a hidden HTML marker naming the source project and thread, plus the labels external, from:<project> and priority: high. It creates missing labels.
      • The orchestration instructions tell agents to use it for cross-project issues instead of raw gh.
    • Reading and classification:
      • External: has another project's marker, or is unmarked and written by someone other than this repository's T3 records. That includes the owner writing by hand on GitHub.
      • Own: has this repository's marker, or matches T3's own records. Ignored.
      • Marked cross-project events count as tagged, so they can trigger the 15-minute digest.
    • Receiver enforcement. When the watcher sees an external issue without the labels, it adds external and priority: high, plus from:<project> when the marker names one.
    • Priority inside T3. External, high-priority items sort first in the inbox, the digest and the Issues page Inbox.
      • The repository orchestrator is told when an external issue needs triage, for example into a milestone.
      • Nothing is auto-admitted outside the selected milestones.
    • Not in scope: GitHub Projects' Priority field. Labels only; add the field if the owner uses it.
  2. tannerpolley commented on Oct 14, 2026

    @tannerpolley
    OwnerAuthor

    Scope change (owner, 2026-10-14): no body-edit tracking.

    GitHub doesn't log issue body edits. Detecting them meant snapshotting and diffing every open issue, and that was the source of most review defects.

    The inbox now reports:

    • new issues;
    • new comments;
    • close and reopen;
    • label and milestone changes;
    • title renames.

    All of these come from GitHub's issue events log and the issue and comment lists. Body text edits are not reported.

    Catch-up overflow. If more activity arrived while T3 was offline than one catch-up can page through, the watcher moves its cursor past it. It adds one tagged "missed activity, check GitHub" entry instead of retrying.

    Own-change matching. T3's own changes are matched only against real transitions (no-ops are skipped), inside the GitHub request's actual time window.

  3. tannerpolley commented on Oct 14, 2026

    @tannerpolley
    OwnerAuthor

    Landed on main (through e8b00b2) and shipped in v2.12.7. Body-edit tracking was dropped by owner decision.

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions