Skip to content

powershell-lsp: close the I0.1 rationale residual (ManifestConsistency) + v1.24.1 release-prep (000124)#84

Merged
manderse21 merged 4 commits into
mainfrom
dispatch/000124-i01-residual-v1241
Jul 10, 2026
Merged

powershell-lsp: close the I0.1 rationale residual (ManifestConsistency) + v1.24.1 release-prep (000124)#84
manderse21 merged 4 commits into
mainfrom
dispatch/000124-i01-residual-v1241

Conversation

@manderse21

Copy link
Copy Markdown
Owner

Closes the I0.1 rationale-coverage residual and cuts v1.24.1. Dispatch 000124, leg 1 (leg 2 is a
survey and contributes no diff). PATCH-bearing, 8 files, +159/-26.

What changed

  • The entry. scripts/regen-rule-rationales.ps1 gains a fifth hand-authored owned rationale,
    keyed ManifestConsistency -- the ruleId the finder actually emits (lsp-common.ps1:2196,2208,
    pses-daemon.ps1:816), confirmed on disk before authoring, not the function name
    Test-ManifestConsistency. 175 chars against the 180 cap, pure printable ASCII.
  • The table. rulesets/rule-rationales.psd1 regenerated by the script, never hand-edited:
    59 entries = 54 auto-derived PSSA (unchanged, byte-for-byte) + 5 owned. The artifact diff is
    3 insertions / 1 deletion.
  • The text is faithful to the predicate. One code carries two finding kinds, so the rationale
    names both: a manifest listing a function that is never defined (orphan-export), and a function the
    module defines and exports that FunctionsToExport omits (under-declared-export). It does not claim
    the module is broken, because every indeterminate shape (wildcard '*', empty/null
    FunctionsToExport, dot-source, dynamic export, unparseable module) degrades before any finding
    is emitted.
  • Guards moved to the 5-owned world. Enumerated from disk rather than assumed -- there were
    three, not one (the count assertions read the table from disk and self-adjust).
  • Roadmap. The Horizon 0 I0.1 residual clause is retired; the entry reads closed.

A correctness fact this surfaced

ManifestConsistency is emitted from a second site for the indeterminate case
(pses-daemon.ps1:816, _indeterminate = $true, "cannot be determined"). lsp-client.ps1 routes
those to the prose-note channel and only determinate findings into $diags, so the new entry can
never render "the lists disagree" onto a note saying the opposite. That separation was previously
unguarded and is now pinned by an integration test that goes RED if it is removed.

Decisions (the inbox's open questions)

  • OQ1 -- one PR. Leg 2 produces no diff, so this carries leg 1's build + docs + release commits
    and one merge gate (the 000121 shape).
  • OQ2 -- PATCH, v1.24.1. The versioning policy in CHANGELOG.md reserves MINOR for a new
    capability. The rationale feature shipped at v1.24.0; this completes the coverage of its generated
    data table. Decisive on-disk precedent: [1.21.1] shipped as PATCH while removing three rules
    from the base surface
    -- a strictly larger observable-diagnostics change than adding one prose
    line. No deviation.
  • OQ3 -- no compatibility note. The 000121-era verified outbox custom_checks that assert the
    4-owned world are terminal and not re-run. The live guards that pinned 4 were in scope and are
    updated.

Deviation (approved in-session by Mike)

The Section 3 feedback table, row 9, still read one-entry residual -> I0.1, which is outside the
dispatch's named scope (scope_in names Horizon 0; scope_out forbids other roadmap edits). Left
alone it would make the roadmap self-contradict -- Horizon 0 closed, table row open. Mike granted the
one-cell edit explicitly. The roadmap diff is exactly two hunks: the named clause and that cell.

Verification

Every check proven non-vacuous, each by RED-then-GREEN, with the artifact restored bit-for-bit
after each mutation:

  • regen -Check exits 0 on the shipped table; exits 1 on a perturbed rationale text and on a
    dropped owned-list entry, each with a precise diff.
  • The three updated unit guards go RED against the pre-change (4-owned) table restored from HEAD;
    the degrade guard, which is invariant across this change, was instead proven RED by injecting an
    entry for its exemplar.
  • The new integration assertion goes RED on the pre-change table -- the finding renders with no
    why: line, which is precisely the behaviour this closes.
  • The degrade path keeps a real exemplar rather than a synthetic one: PSUseSingularNouns is a
    genuine PSScriptAnalyzer code, deliberately entry-less because 000092 excluded it from base.psd1
    as measured-noisy, yet still reachable when a user's own PSScriptAnalyzerSettings.psd1 enables it.
    The test asserts it is absent from the table so the exemplar cannot silently stop being one, and
    says so in a comment for future curation / pin-bump work. The synthetic case is kept as a second
    assertion.

Full local suite green on both hosts: pwsh 7 -- 1194 passed, 0 failed; Windows PowerShell 5.1 --
1192 passed, 0 failed, 2 skipped
. Frozen properties hold: a clean file still emits nothing, and
per-rule dedup is unchanged.

Tag and release pipeline are untouched -- bump-version.ps1 only prints the tag command. HELD for
Mike's merge gate.

https://claude.ai/code/session_01LzLuvSXsCK7ahhK1WUCFGT

@manderse21 manderse21 merged commit 9c5925b into main Jul 10, 2026
4 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.

2 participants