Description
The engine currently creates pending yes/no clarification for these use X instead of Y cases:
Y is prohibited:
- prompt:
"Y" is currently prohibited. Did you mean to remove it and use "X" instead?
X is prohibited:
- prompt:
"X" is currently prohibited. Did you mean to remove "Y" and use "X" instead?
These paths appear to go beyond a conservative repair of replacement intent. Resolving them requires the engine to choose or authorize additional policy mutations rather than merely correcting a uniquely recoverable directive.
The directive drafter is likely the better layer for reformulating intent in these conflict cases. Core can return a non-pending clarify that explains the state conflict, after which the user or drafter can produce a new explicit directive.
The separate case where Y does not exist should remain out of scope for this issue: proposing use X is a straightforward deterministic repair.
Reproduction
- Establish
prohibit Y, then submit use X instead of Y.
- Establish
prohibit X (and any state required for Y), then submit use X instead of Y.
- Observe that each response creates pending clarification and can be accepted with
yes.
Audit the exact state mutations performed after confirmation, including whether either path compiles to multiple policy operations.
Expected behavior
Decide and document a narrower ownership boundary:
- core-owned pending confirmation for deterministic, semantics-preserving repairs;
- non-pending clarification for conflicts that require a stronger policy rewrite or additional inferred mutations;
- drafter/user supplies the new explicit directive.
If the prohibited-item branches are changed, update engine tests, regression fixtures, conformance fixtures, and directive grammar/API documentation as applicable. Preserve Python/TypeScript parity.
Description
The engine currently creates pending yes/no clarification for these
use X instead of Ycases:Yis prohibited:"Y" is currently prohibited. Did you mean to remove it and use "X" instead?Xis prohibited:"X" is currently prohibited. Did you mean to remove "Y" and use "X" instead?These paths appear to go beyond a conservative repair of replacement intent. Resolving them requires the engine to choose or authorize additional policy mutations rather than merely correcting a uniquely recoverable directive.
The directive drafter is likely the better layer for reformulating intent in these conflict cases. Core can return a non-pending
clarifythat explains the state conflict, after which the user or drafter can produce a new explicit directive.The separate case where
Ydoes not exist should remain out of scope for this issue: proposinguse Xis a straightforward deterministic repair.Reproduction
prohibit Y, then submituse X instead of Y.prohibit X(and any state required forY), then submituse X instead of Y.yes.Audit the exact state mutations performed after confirmation, including whether either path compiles to multiple policy operations.
Expected behavior
Decide and document a narrower ownership boundary:
If the prohibited-item branches are changed, update engine tests, regression fixtures, conformance fixtures, and directive grammar/API documentation as applicable. Preserve Python/TypeScript parity.