--- name: github-manager description: Use when configuring or optimising GitHub repositories for cost-effective, consistent operations — CI triggers, Actions billing, issue tracking, labelling, branch protection, or release workflow. --- # GitHub Manager > **CI validates what cannot be cheaply verified locally. It is not a remote test runner for every commit.** This skill enforces disciplined, cost-aware GitHub operations. It turns GitHub from a free-for-all into a governed delivery surface: selective automation, traceable issues, consistent labels, and protected mainlines. ## When to use - Setting up or revising a repository's CI/CD workflow - Investigating unexpected GitHub Actions spend - Creating or triaging issues and defining acceptance criteria - Designing a label taxonomy or branch-protection policy - Preparing a release process or tag strategy ## Operating model context This skill governs the GitHub surfaces that enforce the harness contract at the repository level. It is not general DevOps housekeeping — each procedure below maps to a harness invariant: - **Branch protection + required status checks** are the enforcement mechanism for the PR review gate and the exact-candidate binding rule. A CI check that passes on an unprotected branch is a claim; a passing check required by branch rules is evidence. - **CI receipts are delivery evidence.** "It worked locally" is not an artefact. A CI run tied to a commit SHA is. Structure your workflow so evidence is machine-readable and SHA-bound, not dependent on a contributor's local environment. - **Modifying branch protection, CI pipelines, or billing settings is an R2 action.** These changes affect all contributors and shared infrastructure. Classify risk, confirm authority, and record the decision before any write. Use `release-readiness` to gate a specific deployment. Use this skill to configure and audit the repository surfaces that make those gates trustworthy. ## Procedure ### 1. Rightsize CI triggers - **Push to default branches** should run lightweight gates only (lint, typecheck, unit tests). - **Pull requests and version tags** run the full pipeline, including packaging and cross-platform smoke tests. - **Feature branches** do not fire CI on every push; open a PR when ready for validation. - **Path filters** skip irrelevant jobs: docs-only changes should not rebuild the extension, code-only changes should not re-render documentation. ### 2. Minimise Actions billing - Know the runner multipliers: Linux ×1, Windows ×2, **macOS ×10**. - Gate expensive runners (macOS, Windows) behind PRs and releases, not every push. - Cache dependency stores (`cache: 'pnpm'`, `cache: 'npm'`, pip, etc.). - Do not run local-integration or exploratory tests in CI; keep them local or on-demand. - Set a spending limit and billing alert before usage surprises you. ### 3. Structure issues and tracking - Every issue states a **problem or outcome** and has **acceptance criteria**. - Link PRs to issues (`Closes #123` or `Refs #123`). - Close issues with a concise note explaining what changed and where. - Use milestones or projects for release-scope tracking, not long-lived catch-all issues. ### 4. Label consistently Adopt a namespaced taxonomy and avoid one-off labels: | Namespace | Examples | Purpose | |---|---|---| | `kind/` | `kind/bug`, `kind/feature`, `kind/docs` | Type of work | | `area/` | `area/ci`, `area/ui`, `area/security` | Component or domain | | `priority/` | `priority/p0`, `priority/p1` | Triage urgency | | `status/` | `status/blocked`, `status/needs-review` | Workflow state | ### 5. Protect the mainline - Require PR reviews before merging to `main`. - Require status checks to pass (lint, typecheck, test). - Use squash or rebase merges for a linear history; avoid merge commits unless the project explicitly allows them. - Restrict force-push and deletion on default branches. ### 6. Define the release workflow - Tags (`v*`) trigger release builds and deployments, not manual uploads. - A release checklist verifies version alignment, changelog entry, and rollback plan. - Generated artifacts (VSIX, containers, packages) are produced by CI, not a local workstation. ## Outputs - CI trigger matrix: event → jobs that run - Monthly Actions cost estimate with runner-multiplier breakdown - Issue template with acceptance criteria - Label taxonomy - Branch-protection policy - Release checklist ## Guardrails - **Local testing is not CI.** If a check belongs on a developer's machine, do not run it on every push. - **macOS minutes are the silent budget killer.** A one-minute macOS job costs ten billable minutes. - **Unconditional full pipelines scale badly.** Every unconditional job is a tax on every future commit. - **Labels without a taxonomy become noise.** Delete or consolidate labels that do not fit the scheme. - **Never deploy from a local build.** Release artifacts must come from CI to be reproducible. ## Anti-rationalization table | Excuse | Counter | |---|---| | "Run everything on every push to be safe" | Safety is selective gates, not redundant burn. Run full checks on PRs and tags. | | "It's only a few CI minutes" | At 10× for macOS, "a few minutes" becomes hundreds of dollars per cycle. | | "We'll clean up labels later" | Label debt compounds fast and breaks automation that depends on them. | | "Force-push is fine, we're a small team" | Force-push on `main` destroys recovery options. Protect the branch. | | "I'll build the release artifact locally" | Local builds are not reproducible or auditable. CI produces release artifacts. |