chore: reconsider underscore-prefix convention for reusable workflow filenames (aesthetic) #155
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#155
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The question
Operator surfaced 2026-06-27: the underscore prefix in
_release.ymland_manifest-check.ymllooks aesthetically noisy, particularly in the consumer'suses:reference (uses: ...@v/.forgejo/workflows/_release.yml@vX.Y.Z). The convention may be informal — could we use cleaner names?What the underscore signals (today)
The
_prefix is an informal community convention marking a workflow as "internal/reusable" — meant to be invoked viaworkflow_call, not directly. It's NOT a substrate-enforced convention; Forgejo Actions and GitHub Actions both treat underscore-prefixed and non-prefixed names identically.In the toolkit:
_release.yml— reusable (called by consumers viauses:)release.yml— consumer wrapper (the toolkit's own consumer of the reusable, for self-cuts)_manifest-check.yml— reusablemanifest-check.yml— consumer wrapperThe convention disambiguates the pair in the SAME directory. Forgejo Actions doesn't support subdirectories under
.forgejo/workflows/, so the names MUST differ in some way.Why the noise matters
External consumers type the full reusable path in their
uses::The underscore is genuinely visible at the adoption surface. Cleaner naming could improve first-impression aesthetic for new consumers.
Naming options
(A) Keep current
_release.yml(reusable) +release.yml(consumer wrapper).Pro: informal community signal; concise prefix; established in the toolkit since v0.1.0.
Con: aesthetic noise; underscore is unconventional in some naming aesthetics.
(B)
-reusable/-callable/-implsuffix on the reusableExamples:
release-reusable.yml+release.ymlrelease-callable.yml+release.yml(mirrorsworkflow_callschema)release-impl.yml+release.yml("impl" for "implementation")Pro: explicit naming makes the role clear; aesthetic underscore gone.
Con: longer filenames in
uses:references; choice of suffix word is bikeshed.(C) Inverse: clean reusable + named caller
release.yml(reusable) +release-dispatch.yml(orrelease-trigger.yml/release-consumer.yml) (consumer wrapper).Pro: the more-visible name (in consumer
uses:lines) is the cleaner one.Con: the toolkit's own consumer wrapper gets a less-natural name; consumers' OWN wrappers would now diverge from the toolkit-internal name (cellblock's
release.ymlis currently the same pattern as the toolkit'srelease.yml; this option breaks that mirroring).(D) Different
-prefix on the reusableExamples:
lib-release.yml+release.ymlcore-release.yml+release.ymlPro: alternative readability; no underscore.
Con: arbitrary; reads more like a folder-prefix-as-name than a workflow descriptor.
My lean
(B) with
-callablesuffix:release-callable.yml+release.yml. Reasons:callablemirrors theworkflow_callschema name (substrate-honest)uses:line reads as a sensible identifier:release-toolkit/.forgejo/workflows/release-callable.yml@vXrelease.yml(matches cellblock + future adopters' natural naming)Runner-up: keep current (A) on the grounds that the underscore convention is established + not actively broken.
Impact surface
If we engage (B):
.forgejo/workflows/_release.yml→release-callable.yml(or other chosen suffix).forgejo/workflows/_manifest-check.yml→manifest-check-callable.ymluses:references across the toolkit + integration.md + cellblock (#168's release.yml) + future adoptersscripts/check-self-bootstrap.shcompose-scripts listtests/workflows.batsif it greps on filename patternsEstimated scope: ~15-20 file edits. Mechanical but touches many surfaces. Worth bundling with another sprint that's already touching the workflow files (e.g., #148 build-bake or #149/#150 Unicode).
Composition
uses: ...@v0.10.4-rc.1referencing_release.yml. After this rename, cellblock'srelease.ymlwould need updating on its next toolkit-version bump.What this PR does NOT do
Refs
_prefix is a community signal but not substrate-enforced; mixed practice across public Forgejo/GitHub-Actions reusable-workflow librariesOperator preference signaling 2026-06-27:
lib-prefix (lib-release.yml+release.yml) — preferred alternative if changing-callablesuffix — too explanatoryForward decision-tree: if engagement happens, lean between (A) and (D). Either decision can ship as a bundle with #148 when the workflow files are getting touched anyway.
Sprint 4 decision: (A) keep underscore for now
Operator directive (2026-06-27 sprint wave): "lean (A) keep-underscore unless cold-read findings argue (D) lib-". The cold-read pass is Sprint 8 (#160) — not yet executed.
Current decision: (A) keep underscore (
_release.yml+_manifest-check.yml). The aesthetic concern is real but the change touches many surfaces (~15-20 file edits + consumer wrapper schema shift + check-self-bootstrap.sh fixture); not worth committing until cold-read findings inform the call.Sprint 4 (#148 build-bake) proceeds with current naming intact.
Conditional re-engagement
Re-open this tracker after Sprint 8 cold-read findings land if:
lib-prefix consensus emergesClosing for now to keep the sprint wave focused. Holding (A) as the operative decision until cold-read provides empirical input.
Re-opening — closing was premature
Operator surfaced 2026-06-27: closing trackers tends to make them forgotten. The decision here is genuinely DEFERRED-PENDING-INPUT, not RESOLVED. Re-opening with the dependency made explicit.
Status
Blocked on: #160 (cold-read of README.md + adopter-facing markdown — Sprint 8 of the pre-1.0 wave). The decision tree's empirical input — whether cold-read reviewers flag the underscore convention as a problem — is the trigger for re-engaging this tracker.
Current operative decision: (A) keep underscore. The Sprint 4 #148 build-bake PR will proceed with current naming unchanged; the rename surface (~15-20 file edits + consumer wrapper schema shift + check-self-bootstrap.sh fixture) is preserved as the cost-of-change if (D) or (B) wins post-cold-read.
Re-engagement trigger
When #160 cold-read findings land:
Why not close + re-file later
Closed trackers get forgotten; the cost-of-change estimate + decision-tree + operator-lean are captured here and would have to be re-derived. The forgetting failure mode is exactly the cost the operator surfaced.
Keeping open + blocked-by-#160 makes the deferral visible at any future scan of the open tracker list.
uses: @ref#172Direction locked (2026-06-28)
Operator decision: pre-1.0 rename arc to
reusable-prefix. Replace_prefix (which can read as "internal/private") with explicitreusable-prefix (clean, descriptive, immediately signals workflow_call shape)._release.yml→reusable-release.yml_manifest-check.yml→reusable-manifest-check.ymlBreaking for consumers (their
uses: frankenbit/release-toolkit/.forgejo/workflows/_release.yml@vX.Y.Zpaths break). Pre-1.0 timing is appropriate — better now than post-1.0 where breaking renames become a real cost.Implementation surface
.forgejo/workflows/_release.yml→ rename toreusable-release.yml.forgejo/workflows/_manifest-check.yml→ rename toreusable-manifest-check.ymlscripts/check-self-bootstrap.sh— updateDEFAULT_COMPOSE_SCRIPTSlist (compose-script-touch triggers re-pin)scripts/release-prep.sh— sed targets for build-bake marker (verify path strings are still anchored correctly)scripts/repin.sh— wrapper-edit pathsdocs/integration.md— exampleuses:pathsexamples/go-project/.forgejo/workflows/*.yml— consumer wrapper templatesexamples/node-project/.forgejo/workflows/*.yml— sameAGENTS.md§2 build-bake section + any other path-anchored referencestests/check-self-bootstrap.bats— fixturestests/repin.bats— fixturesEstimated scope: ~50-80 lines + bats fixture updates. Engineer-shape recon-before-build.
Cuts implication
Will land as v0.18.0 (minor, per
pre_v1_breaking_to_minorpolicy). After cut, adopters (cellblock + future tmux-tell) update theiruses:paths in the same bump cycle that drops obsolete config.Engineer dispatch following.