Skip to content

chore: split the label manifest into baseline and per-repo overlays - #69

Merged
jan-kubica merged 1 commit into
mainfrom
chore/manifest-overlay
Aug 4, 2026
Merged

chore: split the label manifest into baseline and per-repo overlays#69
jan-kubica merged 1 commit into
mainfrom
chore/manifest-overlay

Conversation

@jan-kubica

Copy link
Copy Markdown
Contributor

Follow-up to #66 and #67. labels.yml mixed org-wide process labels with ones only meaningful inside the application repo, so opting folio or a Rust package into the sync would have created an "outlook plugin" label in a DOCX library. That is why #66 defaulted the target to stella rather than all.

The split

labels.yml          # baseline: 26 labels every repo that opts in receives
labels/stella.yml   # overlay: 16 labels specific to stella/stella

The script reads the baseline, then merges labels/<repo>.yml on top when it exists. An overlay entry wins on a name collision, so a repo can retune a shared label without forking the manifest.

Moved to the overlay: 🤖 AI, 🎨 ux, 🔌 external data, 📬 outlook plugin, 🧮 table. Promoted into the baseline: run-pr-lint and invalid, which are governance and a GitHub default rather than product surface.

Declaring what was already there

labels/stella.yml also declares eleven labels stella/stella has carried all along that the manifest had never heard of: the six react-doctor: * CI labels, 📝 docx-editor, 🌍 i18n, 🐞 bug, agent-feedback, and javascript.

They previously survived a prune only because prune skips labels still in use. Now they survive because they are declared. That is the difference between apply-with-prune being safe and being meaningful: anything undeclared is now undeclared on purpose.

plan can preview deletions

Prune previously ran only under apply-with-prune, which deletes immediately, so there was no way to review a destructive run before it happened. plan now reports prune candidates and writes nothing; only apply-with-prune deletes.

Verification

Local plan against both repo shapes.

stella/stella, which has an overlay and was synced this morning:

=== stella/stella
create=0 update=0 prune=0 keep=0 mode=plan

Zero on every counter is the load-bearing result: baseline plus overlay reproduces the live state exactly, so the split introduced no drift. prune=0 confirms the overlay accounts for every label actually present.

stella/folio, which has no overlay:

=== stella/folio
  ~ update  bug (description "Something isn't working" -> "Something is not working")
  + create  chore
  + create  docs
  ~ update  enhancement (color #a2eeef -> #0cd187, ...)
  + create  needs approval
  + create  perf
  + create  run-ci
  + create  run-pr-lint
  + create  size/L ... size/XXL
  + create  ⚡ epic
  + create  💭 triage
  + create  📦 dependencies
  + create  🚧 blocked
  + create  🛠️  dev
  + create  🧹 refactor
  - prune   documentation
create=18 update=2 prune=1 keep=0 mode=plan

Baseline only. No 📬 outlook plugin, no 🧮 table, no react-doctor: *. That is the whole point of the split.

shellcheck clean.

After merge

The stella/stella caller pins the reusable workflow to a SHA, and this PR changes that workflow (the sparse checkout needs labels/). The pin must be bumped in a follow-up or the overlay will not be checked out and the sync will silently fall back to baseline only.

labels.yml mixed org-wide process labels with ones only meaningful in the
application repo, so opting folio or a Rust package into the sync would
have created an 'outlook plugin' label in a DOCX library.

Split it: labels.yml is the baseline every repo gets, labels/<repo>.yml
carries product-specific additions and is merged on top, overlay winning
on a name collision.

labels/stella.yml also declares the sixteen labels stella/stella already
carried but the manifest had never heard of (react-doctor, docx-editor,
i18n, the CI bot labels). Those previously survived a prune only because
prune skips labels still in use; now they survive because they are
declared, which makes apply-with-prune meaningful rather than merely safe.

Also let plan preview deletions. Prune previously ran only in
apply-with-prune, which deletes immediately, so a destructive run could
not be reviewed before it happened.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@jan-kubica
jan-kubica merged commit 76d4e3a into main Aug 4, 2026
3 checks passed
@jan-kubica
jan-kubica deleted the chore/manifest-overlay branch August 4, 2026 13:25
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 4, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant