Three merged/abandoned branches are lingering on mathias/skills. Pick up in a future sprint planning session.
tbd/feat-own-the-task-add-delegation-0cec7202 — squash-merged as PR #21, safe to delete
feat/add-dream-skill — status unverified
feat/experiment-spec-skill — status unverified
Verify the latter two are merged or genuinely abandoned before deleting.
Related: tbd_ship fails closed when no CI runs exist for the head commit, so shipped skills never auto-merge or clean up their branch in this repo. Worth deciding whether to add a minimal CI gate (frontmatter/lint check on */SKILL.md) so the trunk-based path completes end to end.
Three merged/abandoned branches are lingering on `mathias/skills`. Pick up in a future sprint planning session.
- `tbd/feat-own-the-task-add-delegation-0cec7202` — squash-merged as PR #21, safe to delete
- `feat/add-dream-skill` — status unverified
- `feat/experiment-spec-skill` — status unverified
Verify the latter two are merged or genuinely abandoned before deleting.
Related: `tbd_ship` fails closed when no CI runs exist for the head commit, so shipped skills never auto-merge or clean up their branch in this repo. Worth deciding whether to add a minimal CI gate (frontmatter/lint check on `*/SKILL.md`) so the trunk-based path completes end to end.
Both halves done — CI gate first, then the branches.
The CI gate (3112b4c, released as v0.8.0)
release.yml → ci.yml, two jobs:
gate — task check + task test on every push and every pull_request to main, fetch-depth: 0 so the manifest/tag parity assertion actually has tags to compare against.
tag — the existing semver-from-trailer logic, unchanged, but needs: gate and if: push && ref == refs/heads/main.
The pull_request trigger is the part tbd_ship needs: it fails closed when no CI run exists for the head commit, which is why shipped skills in this repo never auto-merged.
Also fixed while in there: the tagger pushed the plugin.json bump commit and the tag as two pushes. The gate runs task check on that bump commit, and check asserts manifest == latest tag — so there was a window where it would legitimately fail on a commit that was correct. Now both refs go up in one git push origin HEAD:main "$TAG".
tests/ci_gate_test.sh (7 assertions) pins the wiring: PR trigger present, both tasks invoked, tag needs gate, no second ungated workflow file left behind. Mutation-checked — deleting needs: gate turns it red.
failure → no tag created; git tag still tops out at v0.8.0
The red run is the one that matters. Before this, task check and the 28-case shell suite ran nowhere — the estate backlog classification lists this repo's CI as no_test_step, fails open: green while having tested nothing. It now fails closed.
One deliberate gap: the tagger's own plugin.json bump commit gets no run, because Gitea does not re-trigger workflows on a push made with the runner's token. That is the recursion guard doing its job and the commit only touches a version string.
Stale branches
All three verified merged-by-content before deletion — none was reachable from main (squash merges), and each one's file had simply been relocated into skills/ by the later reorg:
Worth noting for #15: that last branch also carried three SKILLS_INDEX.md rows that the squash-merge dropped, which is plausibly the same mechanism behind the missing experiment-spec and dream index rows.
Both halves done — CI gate first, then the branches.
## The CI gate (`3112b4c`, released as `v0.8.0`)
`release.yml` → `ci.yml`, two jobs:
- **`gate`** — `task check` + `task test` on every push and every `pull_request` to main, `fetch-depth: 0` so the manifest/tag parity assertion actually has tags to compare against.
- **`tag`** — the existing semver-from-trailer logic, unchanged, but `needs: gate` and `if: push && ref == refs/heads/main`.
The pull_request trigger is the part `tbd_ship` needs: it fails closed when no CI run exists for the head commit, which is why shipped skills in this repo never auto-merged.
Also fixed while in there: the tagger pushed the `plugin.json` bump commit and the tag as **two** pushes. The gate runs `task check` on that bump commit, and check asserts `manifest == latest tag` — so there was a window where it would legitimately fail on a commit that was correct. Now both refs go up in one `git push origin HEAD:main "$TAG"`.
`tests/ci_gate_test.sh` (7 assertions) pins the wiring: PR trigger present, both tasks invoked, `tag` needs `gate`, no second ungated workflow file left behind. Mutation-checked — deleting `needs: gate` turns it red.
### Evidence it gates in both directions
| | run | head | conclusion |
|---|---|---|---|
| green path | [#24](https://git.d-ma.be/mathias/skills/actions/runs/4831) | `3112b4c` (main) | **success** → tagged `v0.8.0`, `plugin.json` bumped to 0.8.0 |
| red path | [#25](https://git.d-ma.be/mathias/skills/actions/runs/4832) | `aaf2aba` (throwaway branch, `skills/tdd/SKILL.md` deleted) | **failure** → no tag created; `git tag` still tops out at `v0.8.0` |
The red run is the one that matters. Before this, `task check` and the 28-case shell suite ran nowhere — the estate backlog classification lists this repo's CI as `no_test_step`, *fails open*: green while having tested nothing. It now fails closed.
One deliberate gap: the tagger's own `plugin.json` bump commit gets no run, because Gitea does not re-trigger workflows on a push made with the runner's token. That is the recursion guard doing its job and the commit only touches a version string.
## Stale branches
All three verified merged-by-content before deletion — none was reachable from `main` (squash merges), and each one's file had simply been relocated into `skills/` by the later reorg:
| branch | tip | file | identical to main |
|---|---|---|---|
| `feat/add-dream-skill` | `c739f4c` | `dream/SKILL.md` → `skills/dream/SKILL.md` | yes (`diff` clean) |
| `feat/experiment-spec-skill` | `5ff7989` | `experiment-spec/SKILL.md` → `skills/experiment-spec/SKILL.md` | yes |
| `tbd/feat-own-the-task-add-delegation-0cec7202` | `561044d` | `own-the-task/SKILL.md` → `skills/own-the-task/SKILL.md` | yes |
Deleted. `git branch -r` is now `origin/main` alone.
Worth noting for #15: that last branch also carried three `SKILLS_INDEX.md` rows that the squash-merge dropped, which is plausibly the same mechanism behind the missing `experiment-spec` and `dream` index rows.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Three merged/abandoned branches are lingering on
mathias/skills. Pick up in a future sprint planning session.tbd/feat-own-the-task-add-delegation-0cec7202— squash-merged as PR #21, safe to deletefeat/add-dream-skill— status unverifiedfeat/experiment-spec-skill— status unverifiedVerify the latter two are merged or genuinely abandoned before deleting.
Related:
tbd_shipfails closed when no CI runs exist for the head commit, so shipped skills never auto-merge or clean up their branch in this repo. Worth deciding whether to add a minimal CI gate (frontmatter/lint check on*/SKILL.md) so the trunk-based path completes end to end.Both halves done — CI gate first, then the branches.
The CI gate (
3112b4c, released asv0.8.0)release.yml→ci.yml, two jobs:gate—task check+task teston every push and everypull_requestto main,fetch-depth: 0so the manifest/tag parity assertion actually has tags to compare against.tag— the existing semver-from-trailer logic, unchanged, butneeds: gateandif: push && ref == refs/heads/main.The pull_request trigger is the part
tbd_shipneeds: it fails closed when no CI run exists for the head commit, which is why shipped skills in this repo never auto-merged.Also fixed while in there: the tagger pushed the
plugin.jsonbump commit and the tag as two pushes. The gate runstask checkon that bump commit, and check assertsmanifest == latest tag— so there was a window where it would legitimately fail on a commit that was correct. Now both refs go up in onegit push origin HEAD:main "$TAG".tests/ci_gate_test.sh(7 assertions) pins the wiring: PR trigger present, both tasks invoked,tagneedsgate, no second ungated workflow file left behind. Mutation-checked — deletingneeds: gateturns it red.Evidence it gates in both directions
3112b4c(main)v0.8.0,plugin.jsonbumped to 0.8.0aaf2aba(throwaway branch,skills/tdd/SKILL.mddeleted)git tagstill tops out atv0.8.0The red run is the one that matters. Before this,
task checkand the 28-case shell suite ran nowhere — the estate backlog classification lists this repo's CI asno_test_step, fails open: green while having tested nothing. It now fails closed.One deliberate gap: the tagger's own
plugin.jsonbump commit gets no run, because Gitea does not re-trigger workflows on a push made with the runner's token. That is the recursion guard doing its job and the commit only touches a version string.Stale branches
All three verified merged-by-content before deletion — none was reachable from
main(squash merges), and each one's file had simply been relocated intoskills/by the later reorg:feat/add-dream-skillc739f4cdream/SKILL.md→skills/dream/SKILL.mddiffclean)feat/experiment-spec-skill5ff7989experiment-spec/SKILL.md→skills/experiment-spec/SKILL.mdtbd/feat-own-the-task-add-delegation-0cec7202561044down-the-task/SKILL.md→skills/own-the-task/SKILL.mdDeleted.
git branch -ris noworigin/mainalone.Worth noting for #15: that last branch also carried three
SKILLS_INDEX.mdrows that the squash-merge dropped, which is plausibly the same mechanism behind the missingexperiment-specanddreamindex rows.