Skip to content

feat: second stability declaration (ADR 0036) - #57

Merged
Cylop merged 6 commits into
mainfrom
feat/stability-declaration-2
Oct 23, 2026
Merged

Cylop merged 6 commits into
mainfrom
feat/stability-declaration-2

Conversation

@Cylop

@Cylop Cylop commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Summary

This is the second stability declaration (ADR 0036). The formats added in Phases 1–3 become stable and are pinned by golden fixtures. permesh mcp, starter templates and human-readable output stay experimental.

  • Stable now:
    • the permesh.yaml check and profiles sections;
    • people and profile files, including status;
    • policy version: 2;
    • check report v1;
    • the generic webhook/email JSON body;
    • profile_check and profile_suggest results v1;
    • permesh_access_plan v1, including execution plans;
    • the access_plan, access_verify and access_review results and index.json v1;
    • the command names check, profile, access and init --starter.
  • Version markers, added before freezing:
    • People and profile files accept an optional version: 1. Nothing writes it by default, and leaving it out means 1.
    • Another value gives a clear error that names the file and says what to do, for example: people/bob.yaml: format version 2 is newer than this Permesh reads (version 1); upgrade Permesh.
    • index.json is now {"access_review_index_version": 1, "plans": [...]}. Any other shape is refused with exit 2 before anything is written.
  • Golden fixtures live in crates/permesh-cli/tests/fixtures/stable/ and are checked by tests/stable_formats.rs. They compare exactly, with these exceptions:
    • Times, durations, digests and temporary paths are normalized, after their shapes are checked.
    • files paths compare with / separators.
    • Human text (summary, message, the suggest draft) isn't frozen.
    • Regenerate only after a reviewed change: PERMESH_BLESS=1 (see the fixtures README).
  • Docs: docs/stability.md gains the Stable rows and a "Human-readable output" section. The "experimental" labels are removed from the check, notifications, profiles and access-plan docs; ADRs 0032–0034 have updated Status lines. CHANGELOG and ROADMAP are updated too.

Validation

  • cargo test --workspace: 722 passed, 0 failed. cargo clippy --workspace --all-targets --all-features -- -D warnings, fmt, cargo deny and scripts/check_docs.py are clean.
  • The final Opus review found 1 Critical and 3 Important issues, and I raised 1 Minor (CHANGELOG wording) to Important. All five are fixed, each test-first except the CHANGELOG wording, which is checked by git grep:
    • Windows paths in the check fixtures;
    • a doubled period and misleading hint in the version error;
    • human text frozen by accident;
    • the webhook JSON body not classified;
    • the CHANGELOG still calling stable features experimental.

Deferred minors

  • The index.json refusal message doesn't name the directory or the starter CI remedy (re-run the PR plan job).
  • The fixtures README says additive changes are allowed, while exact comparison fails on new fields; it should say "bless a diff that only adds".
  • ADR 0036 says fixtures pin every frozen format. People and profile files are covered by parsing tests, and there is no access move fixture.
  • There's no mutation self-check on an access fixture.
  • The check result is pinned only with --no-notify.
  • The profile suggest draft re-load assertion is weak.

@Cylop
Cylop merged commit be14988 into main Oct 23, 2026
15 checks passed
Cylop added a commit that referenced this pull request Oct 23, 2026
Fix deferred minors from #55–#57; add small-team setup guide
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