publish-oss-repo · git:20261019.b3a119b · 2026-10-19 · sha256 a69f20f5f01ca128

publish-oss-repo git:20261019.b3a119bA

Immutable. This exact content never changes and is served at /api/v1/blob/a69f20f5f01ca128.

---
name: publish-oss-repo
description: >
  Use when preparing a repository for public release, or auditing one that
  already has working code but still reads as neglected to a stranger or to
  GitHub's own UI — "has the files" is not "reads as maintained". Triggers
  on "publish a repo", "open source this", "release", "make it look
  maintained", "license shows Other", "add topics", "GitHub release", "repo
  badges".
---

# Publish an OSS Repo That Reads as Maintained

**Type:** Open-source — client-agnostic methodology, no project-specific detail.

**Created by akbarsha — https://github.com/iamakbarsha1**

Distilled from reworking a skills repository from merely functional to
publish-ready and finding that working code and green CI still read as
abandoned to GitHub's own UI and to a stranger browsing it.

**Licence:** Released under CC BY 4.0 — share and adapt for any purpose with
credit. Full text: `LICENSE` at the repository root.

**Feedback & Support:** If a rule here proves wrong or needs sharpening,
open an issue on the repository or contact the author at the profile link
above. If the problem is the agent not following a rule below rather than
the rule itself, that's an execution failure — acknowledge and correct it.

## The core rule

"Has the files" is not "reads as maintained." A repo can have a LICENSE, a
changelog, and passing CI and still present as abandoned, because publishing
quality is signalled by machine-detectable facts — a canonical license the
platform's own detector recognizes, tagged releases per version, discoverable
topics, and CI that enforces the artifact's actual contract — and each of
those signals has to be verified through the platform's own API, not assumed
true because the file that's supposed to produce it exists.

## When this fires

**Where:** Taking a working repo public, or auditing one that already has code
and green CI but still looks abandoned to a stranger browsing it — and to
GitHub's own UI, which judges on machine-detectable facts.

**The case this came from.** A skills repository had a LICENSE file, a
changelog and passing CI, and still read as neglected. The LICENSE was a
hand-written CC BY 4.0 summary, so GitHub displayed "Other" and the repo fell
out of license-filtered search; several manifest bumps had shipped with no git
tags and no Releases behind them; topics were unset, so topic search never
surfaced it; and the validator checked frontmatter keys while ignoring the
body contract it was supposed to protect.

**Another shape it takes.** *(Illustrative: A library publishes every release
to the package registry from CI, and the registry page is current. The GitHub
repo has no tags, so anyone arriving from a search result sees a last release
date of "never" and a README badge pointing at a branch, and concludes the
project is dead.)*

## Checks

- **Fetch the canonical license text; never paraphrase it.** GitHub's license
  detector matches against the official legal text, not a legally-equivalent
  summary — a hand-written paraphrase makes GitHub display the license as
  "Other" and drops the repo out of license-filtered search. Pull the real
  text from the canonical source (creativecommons.org, choosealicense.com,
  the SPDX list) instead of transcribing it, and confirm detection through the
  platform's own API rather than eyeballing the file. *(A LICENSE file was a
  hand-written CC BY 4.0 summary; GitHub showed the license as "Other" until
  the canonical legal text replaced it, confirmed via `gh repo view --json
  licenseInfo` — fetching the canonical text also sidestepped a content-filter
  block that pasting the full 400-line legal text directly had tripped.)*
- **Cut a tag and a GitHub Release per version, not just a manifest bump.** A
  version bump that lives only in a manifest file is invisible outside the
  diff — no `git tag` output, no entry under Releases — and the repo reads as
  abandoned even when the code is current. Every version bump gets a matching
  git tag and release, not only the ones that feel significant. When you
  backfill a tag for a version that shipped incrementally, target that
  version's completion commit — the last commit still reading that version,
  the parent of the bump to the next one — not the commit that introduced it.
  The introduction commit holds only the first of the items the changelog
  entry claims. *(A plugin
  manifest had been bumped through several versions with zero git tags and
  zero GitHub Releases behind them; the repo looked unmaintained until a tag
  and release were cut for each version.)*
- **Tie the version bump and changelog entry to the gate that admits the
  item.** A manifest version and a changelog are claims about contents, and
  incremental merges that each skip updating them let the claim drift from
  reality with nothing failing. The repo stays green, because CI validates the
  items themselves and never compares them against what the version claims.
  Make admitting an item and recording it the same gate: CI already enumerates
  the real set for its other checks, so have it assert that a new entry in that
  set comes with a version bump and a changelog line. *(A plugin manifest read
  one version while its changelog stopped four items earlier; four merges had
  each added an item without bumping or recording it, and the gap was invisible
  until someone counted the directories.)*
- **Set repo topics before anyone can find it by browsing.** GitHub's topic
  search and Explore surface only index repos with topics attached — zero
  topics means zero discoverability outside an exact-name search. Add topics
  for the domain, the language or framework, and the specific problem the
  repo solves. *(A skills repository had no GitHub topics set at all, so it
  never surfaced in topic-based discovery until topics were added.)*
- **Make CI enforce the artifact's contract, not just its metadata.** A
  validator that checks frontmatter presence but not the body's required
  shape lets a contribution merge with the right header and none of the
  substance underneath — the gate exists but gates nothing that matters.
  Enforce the structural contract itself (required sections, checklist
  parity, grounding markers) so a shapeless PR fails CI before a human has to
  catch it in review. *(A skills-repo validator checked only that frontmatter
  had `name` and `description`; it never checked for the required `## The
  core rule` section, checklist-to-check parity, or grounding markers, so a
  skill missing all three would still have passed CI.)*

## Pre-flight check — before you call a repo publish-ready

- [ ] The LICENSE file is the canonical legal text from the official source,
      and the platform's own API (e.g. `gh repo view --json licenseInfo`)
      confirms the license is detected, not shown as "Other".
- [ ] Every version bump in the manifest or changelog has a matching git tag
      and a platform release, not just a diff.
- [ ] Admitting an item to the catalogue bumps the manifest version and adds a
      changelog entry in the same change, enforced by CI rather than by habit.
- [ ] The repo has topics set for its domain, language/framework, and the
      specific problem it solves — not zero.
- [ ] CI enforces the artifact's structural contract (required sections,
      checklist parity, grounding markers), not just frontmatter presence.

If any box is unchecked, the repo has the files but doesn't read as
maintained — go close the gap before calling it publish-ready.