Repository navigation
[finding] the conversions defineStack applies still miss two door paths after PR #20579: os lint --json never reads the record, and a defineStack that converts then refuses drops them from --json #20583
Description
Filing gate: ① product defects with a measured reach:, one family, one card. Finding class (a), two locations.
Filed by the domain:spec execution seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx, seat post #18549) from the #20476 dev report 5883869680 (out_of_scope_findings 1 and 2). PR #20579's at-tier record 5884030605 verified both from the code and judged them correctly outside that PR. ⛔ Filed bare: routing, grading and any split belong to triage. ⛔ Not a claim.
The family
defineStack applies the ADR-0087 D2 conversions at load, and only it knows what it converted. PR #20579 (Fixes #20476) records the notices on the stack it returns (stackConversionsOf, @objectstack/spec). loadConfig reads that record as LoadedConfig.stackConversions, and os validate / os build fold it into --json conversions and the --strict gate. Two paths still lose the record. Both depend on PR #20579 landing: until it does, the record does not exist.
Locations (read at PR #20579's head b80dce953b)
os lint --jsonnever folds the record.packages/cli/src/commands/lint.ts:945–:958fillsconversionsonly from its ownnormalizeStackInputpass overloadConfig'sconfig. That config is already canonical, so the pass finds nothing the producer converted, andLoadedConfig.stackConversionsis never read.reach:the public dooros lint --json. The dev measured it atba5927f714throughbin/run-dev.js, on the card's case: adefineStackconfig whosepage:headerauthorsdescription(live conversionpage-header-subtitle-alias). It exits 0 withconversions: [], and the conversion shows up only on stderr.- Shape: a one-line fold, as
validate.ts/compile.tsstep 1b do in PR fix(spec,cli): os validate / os build read the ADR-0087 conversions defineStack applied — --json conversions and --strict see the producer's record #20579. - ⛔ This does not extend the one-shape rule to
os lint. [finding]os validateruns only the stack schema parse, so a config that exports a plain object (nodefineStack()call) skips every defineStack cross-field refusal and passes #20367's confirmation5881817230leaves that rule (OQ3) unopened.stackConversionsOfanswers[]for an unbuilt config, soos lintkeeps accepting exactly what it accepts today. - Re-check, once PR fix(spec,cli): os validate / os build read the ADR-0087 conversions defineStack applied — --json conversions and --strict see the producer's record #20579 has landed:
git grep -n stackConversions origin/main -- packages/cli/src/commands/lint.tsshould answer 0 hits. Positive control: the same grep overpackages/cli/src/commands/validate.tsanswers at least 1.
- A
defineStackthat converts and then refuses loses the conversions from--json. The record rides on the returned stack, and a refusingdefineStackreturns none. The doors' catch-all reports the empty list it holds, because the step 1b fold runs afterloadConfig.reach:the public doorsos validate --json/os build --json. Measured by the dev after the change, with the CLI fromsrc/: a strict config that converts (page:headerdescription) and then refuses (requires: ['no-such-capability']) exits 1 withSTACK_CAPABILITY_UNKNOWNandconversions: []. The notice reaches stderr only.- The run already fails loudly, so this is the smaller half. Closing it needs a second channel, such as the refusal error carrying the notices it applied. That is a shape choice for whoever takes it. The
stackConversionsOfTSDoc in PR fix(spec,cli): os validate / os build read the ADR-0087 conversions defineStack applied — --json conversions and --strict see the producer's record #20579 names this boundary.
Not in this card
- The one-shape rule for serve / migrate / lint / generate:
5881817230, OQ3, deliberately not opened. content/docs/deployment/cli.mdx's "Warnings checked" list foros validate, which names neither conversion notices nor the other advisory classes. It was incomplete before PR fix(spec,cli): os validate / os build read the ADR-0087 conversions defineStack applied — --json conversions and --strict see the producer's record #20579 and was not made false by it: an Acceptance note on that PR, not filed.
Dedupe
A REST listing of the 1,000 most recently updated issues and PRs, open and closed, grepped locally for os lint … conversions, lint --json … conversion, stackConversionsOf, conversions … refus and refusal … conversion notice. Its only hit is PR #20579 itself.
Dedupe words: os lint --json conversions defineStack · stackConversionsOf lint door · defineStack refusal conversions empty · refusal error carry conversion notices
Generated by Claude Code
Activity