Fix #1232: Follow-up: deferred review findings from PR #1227 - #1243
Conversation
…ype default, and the OPTIONAL_MEMBERS drift guard (#1232) LLP 0362 extends LLP 0329#stderr-mirror so the per-call-site mirror opt-in covers a report whose subject is observable only as an absence, refusal or not, and records the prototype-resident default as an accepted cost. The `@ref` above `warnDroppedOptionals` and its test counterpart now point there, and a new test pins the warning's coverage to the optional members `CommandRegistration` declares. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ake the 0335 extension symmetric The `CommandRegistration` drift guard read optional members with `/^[ \t]*(name)\?:/`, which a `readonly foo?: T` member does not match. A member spelled that way escaped both the parse and `OPTIONAL_MEMBERS`, so the two agreed and the guard passed: the exact silence it exists to end. Verified by probe: `readonly ordinal?: number` passed before, fails now. LLP 0362 says in its own body and `Related:` line that it extends LLP 0335 #not-a-fifth-mirror's census, and 0335 carries the inline forward-ref note, but 0335's header `Extended-by:` line named only LLP 0337 and 0362's `Extends:` named only LLP 0329. Recorded the relation on both headers, the way LLP 0337 and 0335 already record theirs. Mechanical forward-refs only; nothing either doc settled is edited. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… widen the drift guard to optional methods The census claims did not match the tree. `mirrorStderr: true` stands at eight call sites, not five: LLP 0344 added the unreadable-cursor refusal and LLP 0334 #recovery-is-announced added two INFO lines that retract a refusal rather than make one, so "the four refusals plus this report" and "the first that is not a refusal" were both false, in a section that tells an auditor to count from it. Restated: the count is open and is not the point, and what singles this report out is that no containment refusal stands behind it at all, neither made nor retracted. The rule in #absence-not-refusal is stated as the sufficient condition it is rather than as a set identity, which the two recovery announcements do not satisfy. The drift guard matched only `foo?: T`, so an optional *method* (`complete?(argv: string[]): string[]`) escaped both the parse and `OPTIONAL_MEMBERS`, and the two agreed by both missing it. That is the shape that always lives on a class prototype, which is exactly what the registry's copy drops. Probe-verified: `ordinal?: number`, `readonly ordinal?: number` and `complete?(argv: string[]): string[]` each fail the guard now. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Verdict: changes requested, and applied. Three findings, all fixed on this branch and verified in the committed tree. Head is now Findings1. MEDIUM. 2. MEDIUM.
Exactly one test fails in each case, with the diff naming the probe. 3. LOW. Verified clean, no finding
ResidualsNone blocking. One observation, not filed: |
…th refusal and drop the drift guard's formatting dependency LLP 0362 #not-a-refusal credited LLP 0344 with adding the unreadable-cursor refusal. LLP 0344 is a Draft RFC on retention under fault that states it decides nothing; the refusal `reportUnreadableCursor` implements LLP 0323 #say-it (and LLP 0329 #stderr-mirror), landed alongside that RFC in #1162. The section now names the refusal, the decision it implements, and the PR, so an auditor following the pointer arrives at a document that settled it. `Related:` swaps 0344 for 0323, which the body now cites. The drift guard's interface parse required the `?` to sit hard against the `:` or `(`. TypeScript allows whitespace on either side and nothing formats this file, so a hand-written `ordinal ?: number` would have escaped the parse and `OPTIONAL_MEMBERS` alike, and the two would have agreed while covering nothing: the same fail-open the widened capture was minted to close. Capture now spans the whitespace. Probed: `ordinal ?: number`, `ordinal? : number` and `readonly complete? (argv)` each fail exactly the coverage test and each name the probe, while a `?:` in a JSDoc line, a required member, and a one-line conditional type still match nothing. LLP 0362 #consequences claimed a pin on `OPTIONAL_MEMBERS` in both directions. The test only runs one way (a key left behind after its member leaves the interface is never named), so the claim is stated as the direction it holds in. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Verdict: changes requested, and applied. Round 2 of 2. Two findings, both fixed on this branch and verified in the committed tree. Head is now Re-verification of round 1's fixesThe
Anchor integrity across the rename is intact. 0329 and 0335 receive mechanical forward-refs only. Both diffs are additive: a header Findings1. MEDIUM. 2. LOW. Mutation evidence. Every probe inserted into
Exactly one test fails in each case and the diff names the probe. Negative probes, all still 0 failures (no false match): 3. LOW, fixed as part of finding 1. Verified clean, no finding
ResidualsLOW, not fixed, and round 1's stated reason for leaving it was wrong. Observation, not a finding. One |
|
Triage of round 2's residuals at head Finding 1 -> #1248. Round 2's unproven observation (one |
Ship risk:
|
Feature or issue
Issue #1232 carries three review findings deferred from PR #1227 at the review-round cap, each triaged as a preference rather than a production risk. (1)
warnDroppedOptionals(src/core/registry/commands.js) carried@ref LLP 0329#stderr-mirror [implements], but 0329 settles that opt-in for containment refusals and#not-every-warndeclines to widen it, while this site refuses nothing: registration succeeds by design and only the absence is left. LLP 0335#not-a-fifth-mirrorstill read "four named containment refusals", so the corpus did not predict the tree. (2) A command class whose base supplies defaults as prototype getters warnsregistered without the declared 'aliases', 'hidden'at every process start, although the stored record behaves identically. (3)OPTIONAL_MEMBERSis a hand-written copy ofCommandRegistration's optional keys with nothing keeping the two in step, so an optional member added to the published interface would silently escape the diagnostic.Solution
Extended-by:gains it, 0335#not-a-fifth-mirrorgains a forward-ref note that "four" is a census at its head, and the@refabovewarnDroppedOptionalsand its test counterpart point atLLP 0362#absence-not-refusal. Annotation-only, so no test can reproduce it: verified by inspection of the committed tree and by a ref-check pass over both files (8 references, 0 broken, both new ones resolving to a live anchor in an Accepted doc).#prototype-default: telling a default from a declared value means reading the member, and the probe is presence-only by design (pinned atreads === 0), so the line is an accepted cost with the same remedydocs/PLUGIN_AUTHORING.mdalready gives.the warning covers every optional member CommandRegistration declarestotest/core/command-registry-register.test.js. It reads the optional keys out ofhypaware-plugin-kernel-types.d.ts, puts every one of them on a prototype, and asserts the WARN names exactly that set, so the guard holds however the coverage is spelled and no production code changes. Verified by adding a probe optional member to the interface: the test fails (+ 'ordinal') and passes again once removed.npm test(5818 pass, 0 fail, 1 skipped),npm run typecheck, andnpm run build:typesare green.Code: +6 / -5 lines
Fixes #1232