Skip to content

A workspace-excluded crate silently misses every workspace-wide posture change #726

Description

@forkwright

Finding

crates/theatron/desktop (periskopio) sat on license = "AGPL-3.0-or-later" for the entire life of the fleet licence posture, while [workspace.package] declared LicenseRef-PolyForm-Noncommercial-1.0.0. The repository was publishing one crate under a licence the project does not use, and nothing reported it.

The cause is structural rather than an oversight by whoever ran the migration.

Evidence

The crate is in the root manifest's exclude list, not members (Cargo.toml:27-30):

exclude = [
    "akouo/shared/akouo-core",
    "crates/theatron/desktop",
]

Every one of the other twenty-one crates carries license.workspace = true and therefore tracked the posture automatically. An excluded crate has no workspace root to inherit from — cargo refuses the manifest outright:

error inheriting `license` from workspace root manifest's `workspace.package.license`
Caused by: failed to find a workspace root

So the excluded crates are precisely the ones that must restate workspace-wide facts, and precisely the ones a workspace-wide edit does not reach.

Note akouo/shared/akouo-core is excluded by the same list and needs the same check.

Why this matters

Licence is the visible instance, but the class is any fact declared once in [workspace.package]edition, rust-version, version, repository, authors. A change to any of them updates twenty-one crates and silently skips the excluded ones, and the resulting disagreement is invisible until someone reads the two manifests side by side. Here it went unnoticed long enough that the fix arrived as an uncommitted edit in a shared clone rather than as a PR.

The failure is also quiet in the direction that matters: the excluded crate keeps building fine. Nothing about a stale value breaks a compile, so there is no signal at all until a human notices — and for a licence, "nobody noticed" is the expensive part.

Desired correction

A check that every workspace-excluded crate's [package] keys agree with [workspace.package] for the keys that are meant to be uniform, run in CI alongside the existing gates.

Licence is the one that must not drift. edition and rust-version are near-certainly meant to be uniform too. version is deliberately independent here — periskopio is on 0.1.14 against the workspace's 0.4.0 — so the check needs an explicit allowlist of keys permitted to diverge rather than asserting blanket equality.

Done when: changing a value in [workspace.package] without updating the excluded crates fails CI, naming the crate and the key that disagrees.

Related

#725 fixes the licence instance.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions