Milestone: #21 (Agent-layer controls & autonomy)
Goal
Extend the existing maintainer auto-maintain layer (#778) with two new modular, config-driven actions:
- Auto-assign PR opener — set a PR's opening contributor as its GitHub assignee.
- Auto-project/milestone matching — attach a PR to an outstanding GitHub Project or Milestone even when it has no closing-keyword issue link, so project/milestone progress tracking stays accurate for work that never explicitly closes an issue.
Both must be independently enable/disable-able per-repo or globally via .gittensory.yml/gate settings, never hardcoded to a specific repo's projects or milestones, and feature 2 must sit behind a pluggable adapter so a future Linear backend can be swapped in without touching the matching logic.
Children
Context
Extends the existing best-effort post-gate auto-maintain step (maybeRunAgentMaintenance, src/queue/processors.ts:2117, wired at :5356-5376), the same hook point that already applies labels via src/github/labels.ts:21. Feature 2 hooks in alongside the existing linked-issue evidence gathering (buildPullRequestAdvisory, src/queue/processors.ts:5239; hard rules in src/review/linked-issue-hard-rules.ts:71,140), and reuses the existing duplicate-PR collision-detection tokenizer for the new text-matching problem (src/signals/engine.ts: tokenize :5301, termOverlap :5273, threshold precedent :865).
Constraints / known blockers (pre-audited, see child issues for detail)
- GitHub silently drops assignees who lack push/triage access to the repo (docs.github.com/en/rest/issues/assignees) — auto-assign must degrade gracefully to a comment-mention/label fallback for external contributors, or it silently no-ops for the majority of contributor PRs.
- GitHub Projects v2 is GraphQL-only and needs a new
organization_projects: write App permission scope (org-level; existing installs need re-consent). Milestones stay REST-only under the existing Issues:write scope.
- Project/milestone text-matching has a materially higher false-positive rate than linked-issue keyword matching (no explicit
#N keyword to anchor on) — must default to suggest-mode (bot comment), never auto-apply, until validated in production.
Done when
Both features ship as independently toggleable settings, default OFF, with GitHub Projects/Milestones as the first adapter behind a swappable interface and a documented path to a Linear adapter.
Milestone: #21 (Agent-layer controls & autonomy)
Goal
Extend the existing maintainer auto-maintain layer (#778) with two new modular, config-driven actions:
Both must be independently enable/disable-able per-repo or globally via
.gittensory.yml/gate settings, never hardcoded to a specific repo's projects or milestones, and feature 2 must sit behind a pluggable adapter so a future Linear backend can be swapped in without touching the matching logic.Children
Context
Extends the existing best-effort post-gate auto-maintain step (
maybeRunAgentMaintenance,src/queue/processors.ts:2117, wired at:5356-5376), the same hook point that already applies labels viasrc/github/labels.ts:21. Feature 2 hooks in alongside the existing linked-issue evidence gathering (buildPullRequestAdvisory,src/queue/processors.ts:5239; hard rules insrc/review/linked-issue-hard-rules.ts:71,140), and reuses the existing duplicate-PR collision-detection tokenizer for the new text-matching problem (src/signals/engine.ts:tokenize:5301,termOverlap:5273, threshold precedent:865).Constraints / known blockers (pre-audited, see child issues for detail)
organization_projects: writeApp permission scope (org-level; existing installs need re-consent). Milestones stay REST-only under the existing Issues:write scope.#Nkeyword to anchor on) — must default to suggest-mode (bot comment), never auto-apply, until validated in production.Done when
Both features ship as independently toggleable settings, default OFF, with GitHub Projects/Milestones as the first adapter behind a swappable interface and a documented path to a Linear adapter.