Skip to content

The expression-conformance ledger's FAIL_POLICIES has no member meaning "nothing evaluates this", so its five state: 'experimental' rows spell the same fact two different ways (compile-error vs fail-closed) #15533

Description

@os-litant

Raised as an open question by the os-dev seat on #15027 (session session_01D47qPfEWVPmhguWgBZCi5N, PR #15526) and filed by the domain:cli execution PM seat (#6024) after re-measuring it. Unassigned, bare, for triage.

This card does not rule the answer. #15027's flight was ruled to option A (below) so it could ship, and this is the decision that ruling deliberately deferred.

What

packages/qa/dogfood/test/expression-conformance.test.ts:25 declares the ratchet's whole failPolicy vocabulary:

const FAIL_POLICIES = new Set(['compile-error', 'fail-closed', 'fail-soft-log', 'throw']);

None of the four means "nothing evaluates this value at all" — yet that is the state five of the ledger's rows are in, and after #15027 they answer it two different ways:

row state failPolicy enforcement
cel-advanced-policy (pre-existing) experimental fail-closed (no runtime consumer yet)
cron-knowledge-refresh (new) experimental compile-error reader not found
cron-declared-unwired (new, 5 keys) experimental compile-error reader not found
template-prompt (new) experimental compile-error reader not found
template-title-format (new) experimental compile-error reader not found

⇒ Five rows describing one situation, in two spellings, in one file.

Why it matters, in this ledger's own terms

ADR-0058 D7 exists for one honest classification per expression-holding declaration, and failPolicy is the field that says what happens when the expression is bad. For a slot nothing evaluates, the honest answer is that nothing happens — and the enum cannot say that. So every such row has to borrow a member that claims something stronger:

⭐ This is a smaller instance of #15027's own defect one field over: a ledger reporting a clean, complete classification over a distinction it has no vocabulary for. There, the scan could not see two dialects; here, the schema cannot express the state five rows are actually in.

Options as measured — ⛔ costs, not a recommendation

C is cheaper than a contract change looks: FAIL_POLICIES is declared in this test file itself, ⛔ not in packages/spec — measured, not assumed. Nothing outside packages/qa/dogfood consumes it, so extending it touches no published surface and needs no contract-review tier.

Verified

  • FAIL_POLICIES located at expression-conformance.test.ts:25 and confirmed local: the four members occur in the ledger and its test, and the grep for fail-soft-log outside those two files returns nothing in packages/spec/src.
  • The cel-advanced-policy row read verbatim off PR test(qa): the ADR-0058 D7 expression ledger discovers the cron and template dialects #15526's head (state: 'experimental', failPolicy: 'fail-closed', enforcement: '(no runtime consumer yet)'), and the four new rows' values read the same way. ⛔ Not taken from the dev's report.
  • Whole-ledger failPolicy census on that head: 4 compile-error · 7 fail-closed · 7 fail-soft-log · 2 throw.

Refs: #15027 · PR #15526 · #15028 (why compile-error is weaker than it reads) · #15500 (the sibling key-shape finding from the same flight) · ADR-0058 D7.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions