Skip to content

Resolve repository releases from owned decisions and effective settings #111

Description

Outcome

As a repository or workflow maintainer, I can release at the level selected by my effective policy and deliberate pull-request decisions, without dependency metadata or ambiguous defaults unexpectedly changing the repository version.

Acceptance scenarios

Scenario: An inherited policy supplies the automatic release level
  Given a release-managed pull request with no owned bump or skip decision
  When its release decision is evaluated
  Then its valid effective DefaultBump supplies patch, minor, or major
  And the selected level and its source are visible to the maintainer
  And omitting all overrides retains the documented patch default

Scenario: Deliberate invocation and pull-request decisions take precedence
  Given a valid repository default and an explicit CallerOverrides value
  When the pull request is evaluated
  Then the invocation override supplies the effective default
  And an explicit owned bump overrides that default
  And omitting CallerOverrides does not mask the repository setting
  And supported false and empty text overrides retain their meaning

Scenario: Unowned metadata cannot select a bump
  Given dependency, bare, retired, or unrelated labels
  When the pull request is evaluated
  Then those labels do not select a repository release level
  And the valid effective default or owned decision remains authoritative

Scenario: Invalid or conflicting intent cannot publish
  Given an invalid supplied setting or conflicting owned release decisions
  When the pull request is evaluated
  Then validation fails with an actionable explanation
  And a valid narrower override cannot hide the invalid value
  And no release is published as a fallback

Scenario: Skip is successful validation without publication
  Given release:skip without another owned release signal
  When the pull request is evaluated
  Then validation succeeds without a new version or release
  And a valid non-prerelease branch is not rejected for lacking a prerelease identifier

Scenario: Prerelease behavior respects reviewed source and cleanup boundaries
  Given an open pull request requesting a valid prerelease
  When it is published
  Then the prerelease targets its exact reviewed head commit
  And a branch-name collision cannot select another source
  When its configured cleanup is evaluated after closure
  Then only matching prereleases are eligible
  And stable releases are never cleanup candidates

Scenario: Conventional settings use the verified release reader
  Given valid settings in .github\release.settings.yml
  When ConfigurationFile is omitted
  Then that file supplies the repository policy
  And documented defaults remain valid when the file is intentionally absent
  When the removed conventional path exists or is explicitly selected
  Then evaluation fails with a precise coordinated filename/reader migration explanation
  And no policy is silently substituted and no publication is attempted
  Given an intentional existing custom settings path
  When it is selected through ConfigurationFile
  Then that explicit path is honored without a legacy discovery alias

Scenario: Consumers receive a sufficient adoption record
  Given the delivery is prepared for review
  When a maintainer reads its complete PR title and body
  Then changed interfaces, compatibility, required adoption actions, and their evidence are available
  And the effective release decision and unresolved prerequisites are explicit
  And a draft candidate is not presented as a production dependency

Scope

This issue owns the release-decision/settings deliverable in the existing #109. Push-authoritative stable publication, controlled aliases, the full durable/RC lifecycle, historical relabeling, and live publication/governance actions are separate outcomes. Date versioning and Discord sending are not requested.

Design and delivery evidence

Implementation choices, repository paths, test counts, and review progress stay in the linked design/PR evidence rather than in these consumer acceptance scenarios.

Technical decisions

  • Preserve the five owned labels and the validated patch/minor/major DefaultBump contract. Resolve settings and decisions through the shared helpers, not a second bump algorithm.
  • action.yml declares shared defaults. Scalar inputs retain file-over-input compatibility; the explicitly selected CallerOverrides YAML/JSON string mapping is the invocation-over-repository channel. Validate every supplied scope before combining values.
  • src/Release-GHRepository.Helpers.psm1 owns configuration/decision resolution, label definitions, validated prerelease context and cleanup selection. src/main.ps1 wires them to the existing PR-state publication path. Push-specific context, exact stable source/record binding, retries and controlled aliases remain 🌟 [Major]: Support push-authoritative releases and moving workflow tags #108.
  • Cleanup compares the identifier after the first version core case-sensitively, excluding later embedded identifiers and invalid cores. Skip never parses a latest version; retain raw release listing required for configured cleanup.
  • Keep the complete migration/bootstrap instructions and source/template evidence in the linked PR. An unpublished candidate is not a production dependency; templates, governance and publication require their separately scoped delivery.

Implementation plan

  • Inspect the existing PR, released reader, actual supported inputs, live checks and ownership.
  • Write missing settings/controller cases first and preserve the exhaustive owned-label matrix.
  • Implement typed overrides, strict supplied-scope validation, provenance and valid non-prerelease contexts.
  • Verify the eight anonymous immutable-v2 bootstrap cases and record caller ordering requirements.
  • Attach the complete source-bound PR record and update target-state README guidance.
  • Reproduce cleanup-separator/case and skip-version review findings with tests before implementation.
  • Fix those findings within the shared helper/controller boundary and verify all 150 repository cases plus eight bootstrap cases.
  • Update the final candidate identity, source-bound record, documentation links and hosted review evidence.
  • Run final-head existing CI and a fresh complete hosted review, including summaries and every in-scope thread.
  • Keep draft state for any unresolved prerequisite or unmet readiness gate.

Earlier resolver implementation evidence

The earlier resolver candidate was b8767c4; the filename revision and current source are recorded below. All 150 repository cases, eight released-reader bootstrap cases, and final-head CI pass. Both complete hosted-review rounds were evaluated; the three inline findings are fixed/resolved. The final summary's tag-authentication caution was checked against the actual dependency and two anonymous bootstrap experiments, without changing checkout security or publishing. This implementation plan is complete, but the Task stays open and the existing PR stays draft because the native decision-enforcement prerequisite is unresolved. The reviewed code is not a production dependency until an authorized immutable engine release exists.

Settings filename revision

The user-directed follow-up changes the actual ConfigurationFile default to .github\release.settings.yml. This supersedes the earlier documentation-only instruction that left auto-release.yml untouched. Typed CallerOverrides, setting names/precedence, the resolver/label contract, environment namespaces and the separate push-authority scope remain unchanged. The user explicitly selected rejection of the removed conventional path even when supplied through ConfigurationFile; legitimate unrelated custom paths remain controllable.

  • Inspect the released and candidate defaults, actual reader, caller examples, tests and native prerequisites.
  • Add test-first cases for new-default loading without injected ConfigurationFile, valid absence, legacy-only/conflicting conventional files, normalized explicit old paths, legitimate custom selection, invalid new data, precedence and no mutation.
  • Implement the single declared release.settings.yml default and actionable migration guard with no legacy reader fallback or alias.
  • Update target-state README and complete source-bound release record, including exact filename/reference/caller ordering and canonical immutable correspondence.
  • Run existing full validation and old-reader bootstrap controls, push small ordinary commits, evaluate current-head full hosted review/CI and report the new ownership boundary.
  • Retain draft status and genuine production/governance prerequisites; maintenance-only Agent merge stays merge_pr=false and GitHub auto-merge off.

Filename revision evidence: the actual reader/default revision is committed at 03e20b8. All 167 repository cases and eleven immutable-v2 bootstrap cases pass. The complete PR record explains coordinated filename/reader/caller adoption; current-head review and the broader canonical convention correspondence remain pending. The independent push-authority input handoff is linked at #108 (comment); no distinct #108 owner or working-copy incorporation is claimed.

Final filename result: all 180 cases pass at 03e20b8 and current-head hosted CI is green. The complete review #109 (review) reports no open issues but defers live end-to-end publication assessment; it is not automated approval. Canonical correspondence is verified against MSXOrg/docs#233 at 734145479ede01a7ccdeb4eb29950d405ed99a09, including https://github.com/MSXOrg/docs/blob/734145479ede01a7ccdeb4eb29950d405ed99a09/src/docs/Coding-Standards/Naming.md#solution-settings-files and the PSModule.yml/SettingsPath exception. No production dependency, release/tag, module settings or live governance change is performed. The native #112 prerequisite keeps readiness blocked.

Activity

  1. changed the title [-]Owned release controls and effective settings determine repository releases[/-] [+]Resolve repository releases from owned decisions and effective settings[/+] on Oct 31, 2026
  2. MariusStorhaug commented on Oct 31, 2026

    @MariusStorhaug
    MemberAuthor

    Reframed this delivery around maintainer-visible Given/When/Then outcomes. Implementation choices, bootstrap verification, migration details, and review progress remain in the linked design and existing PR; publication authority and governance remain separate work.

  3. MariusStorhaug commented on Oct 31, 2026

    @MariusStorhaug
    MemberAuthor

    Restored the technical Task decisions and test-first plan after the clarified aggregate-only guidance. Consumer scenarios remain first; implementation ownership and the verified review fixes are retained below them, with no publication or governance action.

  4. MariusStorhaug commented on Oct 31, 2026

    @MariusStorhaug
    MemberAuthor

    Recorded the decision-enforcement Task as a native readiness prerequisite and updated the candidate documentation link to the verified immutable head. Passing tests and advisory CI do not replace the missing protected-branch decision requirement; the existing PR stays draft, with no live policy change.

  5. MariusStorhaug commented on Oct 31, 2026

    @MariusStorhaug
    MemberAuthor

    Completed the bounded implementation/test/review plan and recorded the verified head and summary assessment. The Task remains open with its native governance prerequisite; no draft SHA is promoted to a production dependency, and no merge/publication/policy action was taken.

  6. MariusStorhaug commented on Nov 1, 2026

    @MariusStorhaug
    MemberAuthor

    User-directed scope amendment: the actual release reader now adopts the canonical name.settings.yml convention. The new filename/migration cases were written before changing the reader; old conventional paths will fail rather than be ignored or loaded as fallback. No production file, release, tag or governance policy is changed.

  7. MariusStorhaug commented on Nov 1, 2026

    @MariusStorhaug
    MemberAuthor

    Implemented the filename revision after its tests failed on the prior reader, preserving the existing settings/label/custom-path interfaces. The new source/default is published as development evidence in the existing PR and #108 handoff; canonical correspondence and full review are still evaluated before readiness.

  8. MariusStorhaug commented on Nov 1, 2026

    @MariusStorhaug
    MemberAuthor

    The completed filename revision now has an explicit consumer scenario and pinned current-source/canonical/review evidence, with its technical plan retained. Previous resolver-source evidence is identified as historical. Native readiness and publication authorization remain separate; no live publication or governance action was taken.

  9. MariusStorhaug commented on Nov 1, 2026

    @MariusStorhaug
    MemberAuthor

    Verified the final MSXOrg/docs#233 naming/module/release guidance at immutable 734145479ede01a7ccdeb4eb29950d405ed99a09 and updated the correspondence links. The #109 reader source remains 03e20b8; conventional naming, explicit custom paths and the PSModule.yml/SettingsPath exception are unchanged. No unmerged documentation branch was imported and no production or governance action occurred.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions