Skip to content

CI: select members by package identity, not by substring - #573

Merged
Sunrisepeak merged 2 commits into
mainfrom
select-members-by-identity
Oct 26, 2026
Merged

Sunrisepeak merged 2 commits into
mainfrom
select-members-by-identity

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

The select step of validate.yml chose the members affected by a descriptor by searching every member's mcpp.toml for the descriptor's short name as a substring.

  • Over-selection: pkgs/o/os.lua (mcpplibs os 0.1.0 #572) selected 113 of 205 members (boost-*, macos, cfg(os = ...), the word exists in comments), about 10 hours of runner time for a package two members name. boost-ext.ut selected 84 members; compat.xi selected 15 members whose only match was a comment.
  • Under-selection: members that reach a package through another package were selected only by accident. compat.openssl selected 6 members and missed the 21 that reach it through asio, curl, httplib, websocket and others.

tests/select_members.py reads each side as what it declares and matches by identity:

  • a member's manifest, as TOML, with mcpp's reading of nesting;
  • a descriptor's identity and deps, through tests/descriptor_identities.lua;
  • the manifest inside a package's archive. It is read from raw.githubusercontent.com at the archive's ref; a release asset is read from the archive itself. path dependencies are followed to other manifests in the same archive.

A member is selected when the transitive closure of its declared graph holds a changed identity. Archives are pinned by sha256, so actions/cache keeps what was read before. A cold run reads about 400 manifests in ~12 s; a warm run takes ~2 s. A manifest that cannot be read is reported as a warning and left to the weekly full run.

Across all 269 descriptors the old rule made 632 selections and the new one 934. Every selection the new rule drops is a substring match in a comment or another word; every selection it adds is a transitive consumer.

tests/test_select_members.py (8 tests) covers manifest nesting, the resolution of spellings, tables opened twice, raw and asset archives, path following, optional manifests, and this repository's own descriptors. The select job runs these tests before it selects.

Sunrisepeak and others added 2 commits October 27, 2026 05:04
…dentity

The select step searched each member's manifest for a descriptor's short
name as a substring: pkgs/o/os.lua selected 113 of 205 members, and members
reaching compat.openssl through asio or curl were never selected.
tests/select_members.py reads members' dependencies as mcpp does, follows
descriptors' deps and the manifests inside packages' archives (cached by
actions/cache, the archives being pinned), and selects by identity.

Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
Co-authored-by: speak-agent <248744407+speak-agent@users.noreply.github.com>
@Sunrisepeak
Sunrisepeak merged commit 4a8c86f into main Oct 26, 2026
9 checks 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