Split out of #11174 / PR #11299, which introduced the behaviour described here. Filed
unassigned, not routed, not graded.
What is unpinned
#11299 makes os validate --json --strict exit non-zero on the same advisory set the
text face fails on. That set is the text face's own warning list, which folds in the
ADR-0087 D2 load-time conversion notices — while the JSON payload carries those notices
separately, under conversions, and its warnings field is the five-way spread without
them.
The reachable consequence, correct and deliberate, is that a config whose only
advisories are conversion notices now exits 1 with:
{ "valid": true, "warnings": [], "conversions": [ ... ] }That cell is documented — PR #11299's changeset states it outright, and
commands/validate.ts carries the reasoning at the emitJson call — but it is not
tested. The pin added in #11299
(packages/cli/src/commands/validate-json-strict-exit.e2e.test.ts) covers the
advisories-present and no-advisories ends and a run without --strict; both of its
fixtures raise zero conversions, as does every fixture in
packages/cli/test/validate-json-warning-parity.e2e.test.ts, which asserts
conversions: [] explicitly as a declared scope boundary.
So the one cell where the exit code is decided by a collection absent from the
warnings field is the one cell no test exercises. A regression that narrowed the gate
back to the payload's warnings field would restore the original divergence for
conversions-only configs and every existing test would stay green.
Why it was not done in #11299
Judged not cheap enough to ride along, and the seat was asked to say so rather than
stretch: it needs a new fixture (no existing one raises a conversion) plus a full
@objectstack/cli dependency-closure rebuild, i.e. another multi-minute hold on the
container's shared verify lock.
Suggested shape
A third fixture on the existing describe, built from that file's CLEAN_SOURCE plus one
key that trips a live conversion — object-compactLayout-to-highlightFields in
packages/spec/src/conversions/registry.ts looks like the cheapest candidate
(compactLayout: ['title'] on the object). Assert, on one run of
os validate --json --strict: exit non-zero, warnings empty, conversions non-empty.
Confirm first that the key raises no other advisory — unknown-key lints run on the
post-conversion normalized, so it should not, but that is the thing to measure rather
than assume, or the fixture pins the wrong cell.
⚠️ Verify the chosen conversion is still registered when this is picked up; entries
retire on a schedule, and a fixture whose conversion has retired raises nothing and the
test passes vacuously — the failure mode this card is about.
Generated by Claude Code
Split out of #11174 / PR #11299, which introduced the behaviour described here. Filed
unassigned, not routed, not graded.
What is unpinned
#11299 makes
os validate --json --strictexit non-zero on the same advisory set thetext face fails on. That set is the text face's own warning list, which folds in the
ADR-0087 D2 load-time conversion notices — while the JSON payload carries those notices
separately, under
conversions, and itswarningsfield is the five-way spread withoutthem.
The reachable consequence, correct and deliberate, is that a config whose only
advisories are conversion notices now exits 1 with:
{ "valid": true, "warnings": [], "conversions": [ ... ] }That cell is documented — PR #11299's changeset states it outright, and
commands/validate.tscarries the reasoning at theemitJsoncall — but it is nottested. The pin added in #11299
(
packages/cli/src/commands/validate-json-strict-exit.e2e.test.ts) covers theadvisories-present and no-advisories ends and a run without
--strict; both of itsfixtures raise zero conversions, as does every fixture in
packages/cli/test/validate-json-warning-parity.e2e.test.ts, which assertsconversions: []explicitly as a declared scope boundary.So the one cell where the exit code is decided by a collection absent from the
warningsfield is the one cell no test exercises. A regression that narrowed the gateback to the payload's
warningsfield would restore the original divergence forconversions-only configs and every existing test would stay green.
Why it was not done in #11299
Judged not cheap enough to ride along, and the seat was asked to say so rather than
stretch: it needs a new fixture (no existing one raises a conversion) plus a full
@objectstack/clidependency-closure rebuild, i.e. another multi-minute hold on thecontainer's shared verify lock.
Suggested shape
A third fixture on the existing
describe, built from that file'sCLEAN_SOURCEplus onekey that trips a live conversion —
object-compactLayout-to-highlightFieldsinpackages/spec/src/conversions/registry.tslooks like the cheapest candidate(
compactLayout: ['title']on the object). Assert, on one run ofos validate --json --strict: exit non-zero,warningsempty,conversionsnon-empty.Confirm first that the key raises no other advisory — unknown-key lints run on the
post-conversion
normalized, so it should not, but that is the thing to measure ratherthan assume, or the fixture pins the wrong cell.
retire on a schedule, and a fixture whose conversion has retired raises nothing and the
test passes vacuously — the failure mode this card is about.
Generated by Claude Code