Make the autonomous issue→PR orchestrator (.claude/skills/airside-agent + the six
.claude/agents/airside-*.md subagents) generic — repo- and owner-independent, with the
GitHub command surface lifted out of the prose, the airside brand removed, and a clean seam
where a different tracker (Jira) could slot in later. Today the workflow only runs against the
one hardcoded repo, the runbook is hard to read, and GitHub is baked in everywhere.
Status: parking lot — dev-tooling cleanup, not product code. Deferred because the loop works
as-is for the single Airnauts/airside repo; this is about portability and maintainability, not a
missing capability. No ADR until committed (it would supersede the airside-agent design notes in
ADR-0042 / ADR-0043).
What's wrong today
- Repo/owner are hardcoded, not configured.
SKILL.md §Config lists REPO =
Airnauts/airside and OWNER = MateuszPaulski and literally says "Treat them as constants for
now; they will move to the top of the file." They never moved — Airnauts/airside is inlined in
~40 gh api repos/Airnauts/airside/... / gh issue list --repo ... call sites across
SKILL.md and all six agent files. You cannot point the loop at another repo without a
find-replace.
- The
airside brand is woven in (~53 places). The idempotency machinery is all branded: the
issue markers <!-- airside-agent-state/-review/-spec/-note -->, the ack prefix
🤖 airside-agent:, the top-level ack key <!-- airside-agent-ack:tl-<id> -->, the bot-comment
disambiguation rule, the pickup label agent, and the skill + six subagent names
(airside-builder, airside-reviewer, …). The user wants this de-branded to a product-neutral
namespace.
SKILL.md is hard to read. 545 lines / 32 KB of narrative algorithm with gh, gh api graphql, and jq snippets inlined throughout. The orchestration logic and the GitHub mechanics
are tangled together in one file.
- GitHub is assumed end-to-end —
gh CLI, GraphQL review threads, draft PRs, gh pr ready.
There is no seam to target another service, even though Integrations: Jira is already a
direction we're considering.
- Stale legacy references.
.claude/agents/airside-triage.md:22,
airside-spec-author.md:22, and airside-builder.md:31 still tell subagents to "ignore the dead
link" to a now-removed docs/ideas.md / docs/issues.md. Those backlogs were retired (GitHub
issues are now the sole backlog) — the agents shouldn't mention them at all.
Shape
-
One config block, referenced everywhere. Actually move REPO, OWNER, PICKUP_LABEL,
BRANCH_PREFIX, REVIEW_CAP to the top of SKILL.md (as the §Config note already promises) and
rewrite every call site to read repos/<REPO>/... / --repo <REPO> from it instead of the
literal. The subagents take REPO/OWNER as inputs already (per the spawn contracts) — make
them stop hardcoding it too.
-
Extract the GitHub command surface to its own reference file. Pull the inlined gh /
gh api graphql / jq snippets out of the narrative into a single
.claude/skills/airside-agent/references/github.md (or a set of named, copy-pasteable command
recipes), keyed by orchestrator operation: scan, load-state, terminal-check,
reconcile-artifacts, post-spec, post-review-note, CI-gate, promote, inline-threads,
top-level-comments, ack/resolve. SKILL.md keeps the algorithm and links to the recipe by name.
This is also the natural place the provider boundary will fall (see 4).
-
De-brand to a neutral namespace. Rename the skill, the six subagents, and every marker / ack
prefix / disambiguation token from airside-* to a product-neutral name (candidates:
task-agent, issue-agent, code-agent — pick one). This ripples to: the SKILL frontmatter
name:, the /loop 5m /<name> target, the subagent_type registrations + fallback preamble
paths .claude/agents/<name>-*.md, and the marker strings. The markers are persisted
idempotency keys in live issues/PRs — any in-flight issue/PR carrying old airside-agent-*
markers needs either a dual-read back-compat window or a clean cutover after in-flight work
drains. There's prior art for a wide deprecate-with-pointer rename in ADR-0038
(the comments→airside rebrand).
-
A tracker/VCS provider seam — design only, do not implement Jira now. Once the GitHub
commands live behind the recipe boundary from (2), define the abstract operations the
orchestrator actually needs — list actionable tasks, read/write structured task state, post a
threaded comment, open/ready/merge a change request, read review threads — so GitHub is one
implementation and a Jira tracker (+ a VCS host) could be another later. Keep this a documented
interface in the skill, not new code; it ties into the existing Integrations: Jira direction.
Switching providers is explicitly out of scope for this issue.
-
Delete the legacy doc mentions in the three agent files above — drop the "ignore the dead
link to docs/ideas.md/docs/issues.md" sentences entirely.
Effort: medium — a doc/tooling refactor, no product source touched. Mostly editing
SKILL.md + the six .claude/agents/*.md, plus the agent-type registrations and the /loop
target name. Steps 1, 2, and 5 are low-risk and independently shippable; step 3 (rename) needs the
in-flight-marker migration handled; step 4 is a design write-up that unblocks a future Jira adapter.
Make the autonomous issue→PR orchestrator (
.claude/skills/airside-agent+ the six.claude/agents/airside-*.mdsubagents) generic — repo- and owner-independent, with theGitHub command surface lifted out of the prose, the
airsidebrand removed, and a clean seamwhere a different tracker (Jira) could slot in later. Today the workflow only runs against the
one hardcoded repo, the runbook is hard to read, and GitHub is baked in everywhere.
Status: parking lot — dev-tooling cleanup, not product code. Deferred because the loop works
as-is for the single
Airnauts/airsiderepo; this is about portability and maintainability, not amissing capability. No ADR until committed (it would supersede the
airside-agentdesign notes inADR-0042 / ADR-0043).
What's wrong today
SKILL.md §ConfiglistsREPO=Airnauts/airsideandOWNER=MateuszPaulskiand literally says "Treat them as constants fornow; they will move to the top of the file." They never moved —
Airnauts/airsideis inlined in~40
gh api repos/Airnauts/airside/.../gh issue list --repo ...call sites acrossSKILL.mdand all six agent files. You cannot point the loop at another repo without afind-replace.
airsidebrand is woven in (~53 places). The idempotency machinery is all branded: theissue markers
<!-- airside-agent-state/-review/-spec/-note -->, the ack prefix🤖 airside-agent:, the top-level ack key<!-- airside-agent-ack:tl-<id> -->, the bot-commentdisambiguation rule, the pickup label
agent, and the skill + six subagent names(
airside-builder,airside-reviewer, …). The user wants this de-branded to a product-neutralnamespace.
SKILL.mdis hard to read. 545 lines / 32 KB of narrative algorithm withgh,gh api graphql, andjqsnippets inlined throughout. The orchestration logic and the GitHub mechanicsare tangled together in one file.
ghCLI, GraphQL review threads, draft PRs,gh pr ready.There is no seam to target another service, even though
Integrations: Jirais already adirection we're considering.
.claude/agents/airside-triage.md:22,airside-spec-author.md:22, andairside-builder.md:31still tell subagents to "ignore the deadlink" to a now-removed
docs/ideas.md/docs/issues.md. Those backlogs were retired (GitHubissues are now the sole backlog) — the agents shouldn't mention them at all.
Shape
One config block, referenced everywhere. Actually move
REPO,OWNER,PICKUP_LABEL,BRANCH_PREFIX,REVIEW_CAPto the top ofSKILL.md(as the §Config note already promises) andrewrite every call site to read
repos/<REPO>/.../--repo <REPO>from it instead of theliteral. The subagents take
REPO/OWNERas inputs already (per the spawn contracts) — makethem stop hardcoding it too.
Extract the GitHub command surface to its own reference file. Pull the inlined
gh/gh api graphql/jqsnippets out of the narrative into a single.claude/skills/airside-agent/references/github.md(or a set of named, copy-pasteable commandrecipes), keyed by orchestrator operation: scan, load-state, terminal-check,
reconcile-artifacts, post-spec, post-review-note, CI-gate, promote, inline-threads,
top-level-comments, ack/resolve.
SKILL.mdkeeps the algorithm and links to the recipe by name.This is also the natural place the provider boundary will fall (see 4).
De-brand to a neutral namespace. Rename the skill, the six subagents, and every marker / ack
prefix / disambiguation token from
airside-*to a product-neutral name (candidates:task-agent,issue-agent,code-agent— pick one). This ripples to: the SKILL frontmattername:, the/loop 5m /<name>target, thesubagent_typeregistrations + fallback preamblepaths
.claude/agents/<name>-*.md, and the marker strings. The markers are persistedidempotency keys in live issues/PRs — any in-flight issue/PR carrying old
airside-agent-*markers needs either a dual-read back-compat window or a clean cutover after in-flight work
drains. There's prior art for a wide deprecate-with-pointer rename in ADR-0038
(the comments→airside rebrand).
A tracker/VCS provider seam — design only, do not implement Jira now. Once the GitHub
commands live behind the recipe boundary from (2), define the abstract operations the
orchestrator actually needs — list actionable tasks, read/write structured task state, post a
threaded comment, open/ready/merge a change request, read review threads — so GitHub is one
implementation and a Jira tracker (+ a VCS host) could be another later. Keep this a documented
interface in the skill, not new code; it ties into the existing
Integrations: Jiradirection.Switching providers is explicitly out of scope for this issue.
Delete the legacy doc mentions in the three agent files above — drop the "ignore the dead
link to
docs/ideas.md/docs/issues.md" sentences entirely.Effort: medium — a doc/tooling refactor, no product source touched. Mostly editing
SKILL.md+ the six.claude/agents/*.md, plus the agent-type registrations and the/looptarget name. Steps 1, 2, and 5 are low-risk and independently shippable; step 3 (rename) needs the
in-flight-marker migration handled; step 4 is a design write-up that unblocks a future Jira adapter.