You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Deliver a production-grade, reusable release automation system using LibreSign as the first consumer.
The normal maintainer journey must require human action only at two review gates:
review and merge the generated release preparation PR;
review and publish the generated GitHub Release draft.
Everything else must be deterministic, testable and reproducible.
LibreSign/libresign#8447 is a disposable proof of concept. It is not a merge target and is not a production dependency. It may be consulted only to extract behavior, tests and lessons.
They may be used to extract useful behavior, fixtures and lessons, but:
neither is a production source of truth;
neither is a merge prerequisite for the final implementation;
conflicting prototype behavior is superseded by this epic and its child contracts;
release-specific Python prototype behavior is retired only when the corresponding PHP implementation reaches tested parity.
Repository boundaries
LibreCodeCoop/release-tool
Owns the reusable PHP release engine:
CLI / PHAR;
domain policies and contracts;
Git/GitHub/filesystem/process adapters;
consumer configuration schema;
release-engine tests and PHAR distribution.
LibreCodeCoop/github-workflows
Owns reusable GitHub orchestration around the PHAR:
composite actions/reusable workflows;
workflow catalog/distribution;
authentication/permission wiring;
orchestration tests;
no duplicated release business logic.
LibreSign/libresign
Owns consumer-specific integration only:
release configuration;
stable-branch/version mapping;
release-file mapping;
per-major changelog source files;
Makefile/package behavior;
thin workflow/catalog integration.
LibreSign/documentation
Owns the public human documentation for:
automated release journey;
equivalent manual procedure;
recovery/troubleshooting;
release-tool and consumer configuration guidance.
It does not own a copy of the changelog or release-history dataset. Canonical release history remains in LibreSign/libresign/docs/changelogs/changelog-<major>.md.
A workstation is not required for the normal path.
The same engine is available through a local CLI for dry-run, diagnostics, manual execution and recovery.
Prepare release inputs
The maintainer-facing workflow exposes:
branch — required;
commit/ref override — optional planning base; default is selected branch HEAD. It is not the final release SHA when release metadata still needs to be committed;
version override — optional; default is automatic calculation;
release channel — alpha / beta / rc / final;
ignore open backport — explicit boolean override;
create follow-up milestone — explicit boolean/choice where applicable.
Any supplied ref must resolve to an immutable SHA that is an ancestor of/equal to the selected branch HEAD. Release preparation may create a new commit on top of that base; the final GitHub Release is pinned to the merged release-preparation commit, not blindly to the input ref.
Version policy
For an existing release line:
at least one included merged PR whose PR title is Conventional Commit feat → next minor;
otherwise any releasable activity → next patch.
Releasable patch activity includes fixes, translations, dependency updates, documentation, tests, refactors, CI and maintenance.
Internal commits inside a PR never promote the release type.
Direct commits not represented by PRs may count as releasable activity, especially translation synchronization, but do not promote to minor.
A deliberately backported feature still promotes that stable line to the next minor.
Major releases are part of opening a new LibreSign/Nextcloud release line and are not inferred from Conventional Commits.
A backport request/comment without an actual PR does not block.
Only an actual open backport PR for the selected stable line blocks by default.
The maintainer can explicitly override this blocker.
Detection must use selected base branch plus backport metadata/patterns; a repository-wide backport-request label query is insufficient.
Project metadata semantics
Keep release/planning dimensions separate:
GitHub Project Status represents workflow/planning state;
Milestone represents the target release train/version;
merged PR Conventional Commit title is the SemVer classification source;
labels provide auxiliary context such as bug/enhancement, feature area, platform, dependencies, security and backport metadata.
Do not use Project Status or contextual labels as the primary SemVer source.
Changelog policy
LibreSign uses one changelog source file per app major under:
docs/changelogs/changelog-<major>.md
The files follow Keep a Changelog semantics and are maintained in English only. There is no per-language changelog workflow.
The selected stable branch is authoritative for the release being prepared. main keeps the aggregate release-history archive for all supported majors and receives the exact released changelog entry after stable preparation.
Release activity is collected once and used independently by:
version policy;
changelog policy.
Rules:
PR titles are the primary Conventional Commit source;
translation activity may come from direct commits;
dependency-bot PRs are collapsed into one dependency entry;
already-published changes are not duplicated;
labels/context may help categorization but cannot override SemVer.
Detailed changelog strategy is #79. LibreSign integration/package behavior is #81.
Release files
For a selected LibreSign stable release, the production release PR changes only:
docs/changelogs/changelog-<major>.md;
appinfo/info.xml;
package.json;
package-lock.json.
If synchronization of the aggregate release-history archive on main requires a separate PR, that PR changes only the corresponding per-major changelog file and reuses the already-reviewed stable release entry.
No release of an older stable may change main's app/package version to the older version.
Milestones
Normal stable releases use the stable-specific release milestone.
The automation can:
identify the current milestone;
rename it to the release version;
create a follow-up milestone when requested;
move remaining open items;
close the released milestone.
EOL/lifecycle data may be shown as context, but support status is not inferred automatically because LibreSign may intentionally support lines beyond community lifecycle.
Prerelease milestone behavior is compatible with #80.
Draft and publication
After an authorized merge:
revalidate the final merged state;
apply/finalize milestone transition;
create/update one GitHub Release draft pinned to the validated SHA;
include curated release notes, closed milestone link and full compare link.
The maintainer explicitly clicks Publish release.
The existing publication workflow remains responsible for packaging, signing, uploading the asset and publishing to the Nextcloud App Store.
A pre-publication correction stays on the same planned version unless the maintainer intentionally starts a different release.
Multi-stable releases
Each stable release is manually initiated.
When several stables are released in one maintenance cycle:
prepare as needed;
publish oldest stable first;
verify successful publication/App Store visibility;
publish the next stable.
Do not automatically select all maintained stable branches in the first production version.
update documentation when user-visible/maintainer-visible behavior changes;
avoid using chat history as an implementation source.
If two issues conflict, the later explicit architectural decision in #70/#78 takes precedence and the conflicting child issue must be corrected before implementation continues.
Issue closure rule
A child implementation issue is complete only when both are true:
every listed Acceptance Criterion is demonstrably satisfied;
every listed Definition of Done item is complete.
Closing evidence should be visible in the implementation PR/checks/artifacts, not only asserted in a comment.
For implementation issues, evidence normally includes as applicable:
merged or ready-for-review production code in the correct repository;
committed versioned schema/artifact contracts promised by the issue;
Goal
Deliver a production-grade, reusable release automation system using LibreSign as the first consumer.
The normal maintainer journey must require human action only at two review gates:
Everything else must be deterministic, testable and reproducible.
LibreSign/libresign#8447 is a disposable proof of concept. It is not a merge target and is not a production dependency. It may be consulted only to extract behavior, tests and lessons.
Prototype status
LibreSign/libresign#8447 and github-workflows#77 are prototype/reference work only.
They may be used to extract useful behavior, fixtures and lessons, but:
Repository boundaries
LibreCodeCoop/release-tool
Owns the reusable PHP release engine:
LibreCodeCoop/github-workflows
Owns reusable GitHub orchestration around the PHAR:
LibreSign/libresign
Owns consumer-specific integration only:
LibreSign/documentation
Owns the public human documentation for:
It does not own a copy of the changelog or release-history dataset. Canonical release history remains in
LibreSign/libresign/docs/changelogs/changelog-<major>.md.Maintainer journey
A workstation is not required for the normal path.
The same engine is available through a local CLI for dry-run, diagnostics, manual execution and recovery.
Prepare release inputs
The maintainer-facing workflow exposes:
Any supplied ref must resolve to an immutable SHA that is an ancestor of/equal to the selected branch HEAD. Release preparation may create a new commit on top of that base; the final GitHub Release is pinned to the merged release-preparation commit, not blindly to the input ref.
Version policy
For an existing release line:
feat→ next minor;Releasable patch activity includes fixes, translations, dependency updates, documentation, tests, refactors, CI and maintenance.
Internal commits inside a PR never promote the release type.
Direct commits not represented by PRs may count as releasable activity, especially translation synchronization, but do not promote to minor.
A deliberately backported feature still promotes that stable line to the next minor.
Major releases are part of opening a new LibreSign/Nextcloud release line and are not inferred from Conventional Commits.
Prerelease behavior is defined in #80.
Backport blocker
A backport request/comment without an actual PR does not block.
Only an actual open backport PR for the selected stable line blocks by default.
The maintainer can explicitly override this blocker.
Detection must use selected base branch plus backport metadata/patterns; a repository-wide
backport-requestlabel query is insufficient.Project metadata semantics
Keep release/planning dimensions separate:
Do not use Project Status or contextual labels as the primary SemVer source.
Changelog policy
LibreSign uses one changelog source file per app major under:
The files follow Keep a Changelog semantics and are maintained in English only. There is no per-language changelog workflow.
The selected stable branch is authoritative for the release being prepared.
mainkeeps the aggregate release-history archive for all supported majors and receives the exact released changelog entry after stable preparation.Release activity is collected once and used independently by:
Rules:
Detailed changelog strategy is #79. LibreSign integration/package behavior is #81.
Release files
For a selected LibreSign stable release, the production release PR changes only:
docs/changelogs/changelog-<major>.md;appinfo/info.xml;package.json;package-lock.json.If synchronization of the aggregate release-history archive on
mainrequires a separate PR, that PR changes only the corresponding per-major changelog file and reuses the already-reviewed stable release entry.No release of an older stable may change
main's app/package version to the older version.Milestones
Normal stable releases use the stable-specific release milestone.
The automation can:
EOL/lifecycle data may be shown as context, but support status is not inferred automatically because LibreSign may intentionally support lines beyond community lifecycle.
Prerelease milestone behavior is compatible with #80.
Draft and publication
After an authorized merge:
The maintainer explicitly clicks Publish release.
The existing publication workflow remains responsible for packaging, signing, uploading the asset and publishing to the Nextcloud App Store.
A pre-publication correction stays on the same planned version unless the maintainer intentionally starts a different release.
Multi-stable releases
Each stable release is manually initiated.
When several stables are released in one maintenance cycle:
Do not automatically select all maintained stable branches in the first production version.
Architecture
The reusable architecture is defined in #78.
Rules:
ReleaseManager;Implementation order / dependencies
The following order is normative for autonomous implementation. Each step must leave a stable artifact/contract used by the next step.
Phase 1 — architecture and executable foundation
LibreCodeCoop/release-tool, PHP CLI/PHAR, QA platform and release of the tool itself..nextcloud-release.ymlschema, parser and typed consumer configuration.Artifacts available after Phase 1:
Phase 2 — reusable domain policies
These extend the same PHP foundation and test conventions. They may proceed in parallel only after their declared dependencies are complete.
Phase 3 — planning and preparation
ReleasePlan v1.ReleasePlan v1and producesReleasePreparation v1.Phase 4 — first real consumer integration and post-merge finalization
PreparedRelease v1; synchronize the exact released changelog entry to the aggregate history onmain.PreparedRelease v1, apply milestone transition and produceMilestoneTransition v1.Phase 5 — draft, publication and verification
ReleaseDraft v1; stop at the human Publish gate.ArtifactValidation v1.PublicationVerification v1.Phase 6 — end-to-end orchestration
Phase 7 — release documentation and single-source history
Phase 8 — production scenario validation
Artifact chain
The implementation should evolve by consuming the output of the previous stage rather than rediscovering state:
An issue must not recreate a value already finalized by an upstream artifact. It may revalidate that value against current external state.
Required cross-issue contract
Every implementation issue must:
If two issues conflict, the later explicit architectural decision in #70/#78 takes precedence and the conflicting child issue must be corrected before implementation continues.
Issue closure rule
A child implementation issue is complete only when both are true:
Closing evidence should be visible in the implementation PR/checks/artifacts, not only asserted in a comment.
For implementation issues, evidence normally includes as applicable:
An issue must not be closed merely because a prototype exists, a happy-path test passes, or coverage increased.
Source of truth
Production source of truth is:
LibreCodeCoop/release-tool;LibreCodeCoop/github-workflows;LibreSign/libresign;LibreSign/documentation; changelog/release history remains canonical inLibreSign/libresign.Chat history and LibreSign/libresign#8447 are not sources of truth.
Definition of done
A maintainer can: