Skip to content

Six claims in WORKFLOW.md's preamble that the document itself falsifies #1206

Description

@ptr727

WORKFLOW.md's preamble, everything above ## 1. Purpose and How to Use This Document, makes six claims about the document that the document falsifies. Found by two whole-unit canonical passes on PR #1203's fix branch, which agreed on the substance, and deferred out of that branch because each fix is a content decision rather than the one-line framing correction it carried.

WORKFLOW.md is carried at intent, so every fleet repository reads this preamble first.

The contract is not purely outcome-shaped

Its defining principle: it describes required outcomes, not a required implementation. Two repos may implement the same guarantee with different YAML.

Section 4's ### D9 - Style / Static (See Section 2) folds section 2 into the contract, and section 4's own preamble says a workflow violating any applicable guarantee is not operational. D9.2 requires specific filenames and name: suffixes, D9.3 requires the folded scalar if: >-, and D9.4 requires type=registry. Those are required implementation.

Section 5A goes further and asserts exact literals, among them release-asset-<branch>-dotnet-publish, nuget-build-<branch>, buildcache-<branch>, !inputs.smoke, the -task.yml suffix, and Check pull request workflow status job. D6.4 requires that "The github-release job body stays verbatim", which is a byte-for-byte match against a reference implementation. So "with different YAML" holds only for the parts 5A does not pin by name, and a reader who re-implements a guarantee freely fails the audit section 5A runs.

Section 2 is binding, not merely legible

The conventions in section 2 keep workflows legible. The contract in section 4 is what they must do.

D9 makes a section 2 violation a not-operational defect, and 5A's D8/D9 line audits those conventions as contract items. "Keep workflows legible" tells a reader section 2 is advisory, and the document treats it as binding.

The trailing sentence carries the same defect:

Each is a MUST, stated as the output a conforming pipeline produces.

That is section 4's own preamble at WORKFLOW.md:148, written by #1198. D9.1 (SHA pins with version comments), D9.2 (name suffixes) and D9.5 (line endings) are static properties of committed source rather than any output a run produces, and D6.2 is the same shape. A fix has to settle whether D9 is exempted or the framing is restated.

The file preamble at WORKFLOW.md:15 used to carry a matching claim and no longer does. #1209 removed it rather than restating it, for this reason, so line 148 is the one place that remains. Related to #1200.

The release policy is mis-located, and the two files each route to the other

Canonical scope. This document is authoritative for the workflow contract and test methodology (sections 3 to 6). The conventions in section 2 and the release policy also live in GOVERNANCE.md ... Section 2 restates them so this file reads on its own.

"Them" is the conventions and the release policy, and section 2 restates only the conventions. The release policy is restated in section 3's ### Release Model subsection, which sits inside the "sections 3 to 6" range the same paragraph declares this document authoritative for and then hands to GOVERNANCE.md. One paragraph gives two answers for the same text.

Section 2 does not restate all of GOVERNANCE.md "Workflow YAML Conventions" either. Its "Validate input/state consistency at entry", "Artifact retention" and "Tag pinning on releases" bullets land in WORKFLOW.md sections 3 and 4 instead.

The precedence rule then holds on one half and fails on the other. For the conventions it is mutually confirmed, since GOVERNANCE.md "Workflow YAML Conventions" says the same. For the release policy GOVERNANCE.md "Release Model" says "See WORKFLOW.md for the full CI/CD contract" and that its own summary "sketches the contract", so a reader holding a real release-policy conflict is told by each file that the other one is authoritative.

The section labels and the range do not line up

Still in that blockquote: "the workflow contract and test methodology (sections 3 to 6)". The contract is section 4 and the test methodology section 5. Section 3 is Architecture and section 6 is the per-project-type walkthroughs, neither of which either label names, so the parenthetical silently widens two labels over two sections they do not describe.

The stated scope is narrower than the rules bind

This file is its sibling for everything under .github/workflows/.

The rules bind version.json (section 1's Default branch bullet, D3.2, D3.3), every committed .sh script (section 2 "Shells"), .editorconfig (D9.5), codecov.yml, global.json and .gitignore (D1.6), composite actions under .github/actions/** (D1.3 and 5A), and a branch ruleset's context: string (D9.2), which is not a file in the repository at all.

This bites in the numbered list directly above:

Audit - statically check the workflows against the conventions (section 2) and the structural facts each guarantee implies (section 5A).

5A's first sentence is "Read the workflow files plus version.json", and section 1 declares a publicReleaseRefSpec divergence there a defect. An agent auditing exactly what the preamble names never opens the file where that defect lives.

The code-style boundary is stated twice and drawn nowhere

a deliberate mixture of code style, architecture, a behavioral contract (expected inputs and outputs), and a test methodology. Code style lives in [CODESTYLE.md][codestyle].

Two adjacent sentences say this file contains code style and that code style lives elsewhere, with nothing stating the boundary. The boundary is not the two-way split implied either: CODESTYLE.md disclaims workflow YAML and routes it to GOVERNANCE.md, and the one rule that visibly straddles it, set -Eeuo pipefail on every committed .sh script, is stated in all three files.

Scope note

One finding, the "Test" bullet telling an agent to "drive a live probe (section 5C)" with no hint that 5C's deploy probe is explicitly maintainer-only and that others need secrets and same-repo access, is already covered by #1201 and is not restated here.

Related to #1200 (section 4's own claims), #1201 (section 5's procedure), #1204 and #1205.

Activity

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

    decisionNeeds the maintainer's decision before it can be worked

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions