You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
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:
⭐ 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:
fail-closed claims a runtime refusal on a slot whose own enforcement cell says there is no runtime consumer. On a security row that reads as a security guarantee.
⭐ 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
B — follow the cel-advanced-policy precedent and use fail-closed on all five. ✅ Internally consistent. ⛔ Cost: it imports a security-tier claim onto four non-security slots that have no runtime consumer to fail closed.
C — extend FAIL_POLICIES with an explicit unevaluated / none member and re-state all five. ✅ Says the true thing and makes the five agree. ⛔ Cost: it is a vocabulary change, so every existing row's value is re-opened for review, and cel-advanced-policy's fail-closed would have to be defended or moved.
⭐ 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.
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.
Raised as an open question by the
os-devseat on #15027 (sessionsession_01D47qPfEWVPmhguWgBZCi5N, PR #15526) and filed by thedomain:cliexecution 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:25declares the ratchet's wholefailPolicyvocabulary:⭐ 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:
statefailPolicyenforcementcel-advanced-policy(pre-existing)experimentalfail-closed(no runtime consumer yet)cron-knowledge-refresh(new)experimentalcompile-errorcron-declared-unwired(new, 5 keys)experimentalcompile-errortemplate-prompt(new)experimentalcompile-errortemplate-title-format(new)experimentalcompile-error⇒ 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
failPolicyis 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:compile-errorclaims the Zod parse is the refusal. True as far as it goes, andCronExpressionInputSchema/TemplateExpressionInputSchemafix the dialect only on the bare-string arm — the envelope arm accepts any declared dialect, so a cron-typed slot parses{ dialect: 'cel', source }green #15028.fail-closedclaims a runtime refusal on a slot whose ownenforcementcell says there is no runtime consumer. On a security row that reads as a security guarantee.⭐ 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
compile-erroron the new rows (what ADR-0058 D7 expression conformance ledger discovers onlyExpressionInputSchema/SettingsVisibilityInputSchemapositions — the 8CronExpressionInputSchemaand 3TemplateExpressionInputSchemasites sit outside the ratchet, unclassified #15027 shipped). ✅ Only option stating something true of those slots. ⛔ Cost: the ledger now disagrees with itself, and a reader comparingcel-advanced-policytocron-declared-unwiredcannot tell whether the difference is meaningful.cel-advanced-policyprecedent and usefail-closedon all five. ✅ Internally consistent. ⛔ Cost: it imports a security-tier claim onto four non-security slots that have no runtime consumer to fail closed.FAIL_POLICIESwith an explicitunevaluated/nonemember and re-state all five. ✅ Says the true thing and makes the five agree. ⛔ Cost: it is a vocabulary change, so every existing row's value is re-opened for review, andcel-advanced-policy'sfail-closedwould have to be defended or moved.⭐ C is cheaper than a contract change looks:
FAIL_POLICIESis declared in this test file itself, ⛔ not inpackages/spec— measured, not assumed. Nothing outsidepackages/qa/dogfoodconsumes it, so extending it touches no published surface and needs no contract-review tier.Verified
FAIL_POLICIESlocated atexpression-conformance.test.ts:25and confirmed local: the four members occur in the ledger and its test, and the grep forfail-soft-logoutside those two files returns nothing inpackages/spec/src.cel-advanced-policyrow 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.failPolicycensus on that head: 4compile-error· 7fail-closed· 7fail-soft-log· 2throw.Refs: #15027 · PR #15526 · #15028 (why
compile-erroris weaker than it reads) · #15500 (the sibling key-shape finding from the same flight) · ADR-0058 D7.