Skip to content

feat(release): project.yaml declares the 30 approved release artifacts - #28

Merged
sinkog merged 1 commit into
develfrom
feat/release-declaration
Nov 2, 2026
Merged

sinkog merged 1 commit into
develfrom
feat/release-declaration

Conversation

@sinkog

@sinkog sinkog commented Nov 2, 2026

Copy link
Copy Markdown
Member

Refs #23. project.yaml declares the 30 files the owner approved as the published surface (docs/en/RELEASE-ARTIFACT-CLASSIFICATION.md, merged in #27). Not to be merged yet (owner: open, do not merge). It authorizes no release; the pre-check is not changed.

Base: devel 3e94bb2 (the compiler of #26 and the classification of #27 are in).

What changes

project.yaml: compiler_settings.release_artifacts.paths, 30 explicit paths, sorted by UTF-8 bytes, no globs (the only change; 34 lines). check_provenance treats project.yaml as seeded, not pinned, so editing it does not trip that gate.

Evidence (tests/test_release_declaration.py, 12 tests, run against the commit under test)

Required Test
all 30 paths exist in the planned source commit, as regular files every_path_is_a_regular_file_in_the_commit_under_test (the commit's git tree, not the working directory)
every published specs[].source_path is among them every_schema_the_compiler_would_publish_as_a_spec_is_listed (13 of 13, selection made on the tree) and the working-directory selection
the Forms 12 are a subset the_twelve_files_of_the_forms_grammar_pin_are_a_subset (the frozen pin fixture; 12 of 12 in, 18 more)
the compiler produces the same declared set deterministically the artifacts block is identical on every run and in 4 declared orders plus 40 permutations, and equals one computed here from git show <commit>:<path> (sha256sum-format manifest); the reference verifier reads it as a conforming list (record layer checks and the blob layer PASS against this checkout)
the declaration is the approved list equal to the yaml block of the merged classification document
the compiler accepts it as the commit holds it _validate_release_artifact_declaration on the declaration read from the commit (the reference reading agrees)
Also: hygiene (unique, sorted, no glob characters, no tests/tools/CI/ai/features/release paths, none of the excluded configuration files), and the real project.yaml validates against project.schema.yaml.

Planted defects, run by hand on the declaration and each turned tests red: dropping a spec file (4 failures), dropping a Forms file (2), adding a missing path (7), adding a glob (7), adding a tooling file (3), swapping two paths (2), dropping dependency.yaml (2, the approved-list equality). Before the declaration was committed, the_compiler_accepts_the_declaration_as_the_commit_holds_it failed with declaration_missing: the test reads the commit, not the working copy.

Local: 794 tests, coverage 90.24 %.

What this does NOT show (and the difference you asked for)

Two different commit states:

  • devel with this declaration (this PR). Of the 12 Forms-pinned files, 11 are byte-identical to the pin 73ae469 here; proposals/atom-grammar/P0-4-MIGRATION.md is not. A release cut from this commit would not satisfy the Forms pin.
  • The release branch from 73ae469 (the owner's decision: a new release from the pin). It needs a new commit that holds this declaration and keeps the exact bytes of all twelve pinned files. That commit is not literally 73ae469; its construction and the byte identity of the twelve (the pre-check, run against that commit) are to be shown separately. Not done here; on hold.

Also not shown: that a release may be made, and anything about authenticity. Signing, publication, the production receipt and the trust gates stay on hold.

compiler_settings.release_artifacts.paths is the list the owner approved as the published surface (docs/en/RELEASE-ARTIFACT-CLASSIFICATION.md, 30 INCLUDE of 131 files). tests/test_release_declaration.py is the evidence: the declaration equals the approved list, every path is a regular file in the commit, every schema the compiler would publish is listed, the twelve Forms-pinned files are a subset, and the compiler produces the same artifacts block on every run and in every order, equal to one computed from the git blobs. It does not show that a release from this commit contains the pinned bytes (P0-4-MIGRATION.md differs), and it authorizes no release.

---
[signing-metadata]
key = cic-my-sign-key
signature = vault:v1:MEUCIElSQsjpG0/F7h5VwYckeriZeuuix5sGUcpF0PorZwKMAiEAwYizhGQ6tUzs9UsQEMNhy4ACrm7PZR2kfVvM0tXFHgg=
hash-algorithm = sha256
digest = OyueUXNPghqbyi5xWgrvg1MYs6wbZAHq0BbOR4CdwUA=

[certificate]
-----BEGIN CERTIFICATE-----
MIICBjCCAaygAwIBAgIUSnRMR6RPnEbg296XWPOqq/u5PCwwCgYIKoZIzj0EAwIw
QzELMAkGA1UEBhMCSFUxGTAXBgNVBAoMEENlbnRyYWxJbmZyYUNvcmUxGTAXBgNV
BAMMEENJQyBEZXZlbG9wZXIgQ0EwHhcNMjYwMzIwMTMyMjU5WhcNMjYxMjMxMTMy
MjU5WjBFMQswCQYDVQQGEwJIVTEZMBcGA1UECgwQQ2VudHJhbEluZnJhQ29yZTEb
MBkGA1UEAwwSR2Fib3IgWm9sdGFuIFNpbmtvMFkwEwYHKoZIzj0CAQYIKoZIzj0D
AQcDQgAEIG2CVmTfmLB9pLLclj7YmP2eedAjklpy4LGrU2ijoiy6Xqpuybv7OgJe
i+ez31s65NEV8+X/ByeX1cstR988z6N8MHowCQYDVR0TBAIwADAdBgNVHQ4EFgQU
yZN6AIX/TNnIJ9GwAa/NRN3ujHAwHwYDVR0jBBgwFoAUXn6CHYzPUqU4JVP8g+OS
WeDYjhcwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEF
BQcDBDAKBggqhkjOPQQDAgNIADBFAiEA+bFzXRoJ4PCQbhAAtpkcMjt0vNj5rEW0
lOMBGDNyaWkCIB1vmM7PcZzv/c9bIrxF5kqv6QXomouhByUfeNUTbpKW
-----END CERTIFICATE-----
@sinkog
sinkog merged commit 331f4a6 into devel Nov 2, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant