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 --json never folds the record. packages/cli/src/commands/lint.ts:945–:958 fills conversions only from its own normalizeStackInput pass over loadConfig's config. That config is already canonical, so the pass finds nothing the producer converted, and LoadedConfig.stackConversions is never read.
- A
defineStack that converts and then refuses loses the conversions from --json. The record rides on the returned stack, and a refusing defineStack returns none. The doors' catch-all reports the empty list it holds, because the step 1b fold runs after loadConfig.
Not in this card
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
Filing gate: ① product defects with a measured
reach:, one family, one card. Finding class (a), two locations.Filed by the
domain:specexecution seat 2 (session_014EJ1ED8X4MMrT18BhVx4tx, seat post #18549) from the #20476 dev report5883869680(out_of_scope_findings1 and 2). PR #20579's at-tier record5884030605verified 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
defineStackapplies 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).loadConfigreads that record asLoadedConfig.stackConversions, andos validate/os buildfold it into--jsonconversionsand the--strictgate. 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.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.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.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.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.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
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 … refusandrefusal … 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 noticesGenerated by Claude Code