Tom Boucher
8de2ff9121
feat(#2008): generic command-exit-zero gate-predicate evaluator (#2011)
* feat(#2008): add generic command-exit-zero gate-predicate evaluator
Third-party capability gates declared via check.predicate were rendered for
display but never evaluated (only built-in check.query gates fired; the
security capability's gate worked solely via a hard-coded ship.md branch).
Add a generic, deps-injected gate-predicate evaluator (src/gate-predicate-evaluator.cts)
that dispatches by predicate.kind. Built-in kind: command-exit-zero — runs a
bounded sh -c command at the project root (via shell-command-projection.execTool),
inherits env, exit 0 => pass, non-zero => block, timeout => block, fail-closed.
Wire a 'check predicate' subcommand into check-command-router.cts and extend
the three generic workflow gate-dispatch sites (execute:wave:post, execute:post,
plan:post) to route check.predicate gates to the new evaluator. The two-step
gate contract (command-failure => onError; block => halt) is unchanged.
- src/gate-predicate-evaluator.cts: pure leaf, KIND_TABLE extensible
- src/check-command-router.cts: cmdCheckPredicate + buildPredicateDeps + parsePredicateFlags
- docs/adr/2008-*, docs/reference/gate-predicates.md, docs/how-to/command-exit-zero-gate.md
- tests: 38 unit + integration tests (exit mapping, timeout, interpolation,
property-based bijection, malformed-predicate fail-closed, real subprocess e2e)
Closes #2008
* docs(#2008): backfill changeset pr number 2011
2026-07-05 14:04:29 -04:00
..
2026-06-20 13:36:57 -04:00
2026-06-15 20:53:38 -04:00
2026-07-03 12:18:25 -04:00
2026-07-02 23:30:19 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-02 18:35:29 -04:00
2026-06-11 21:42:52 -04:00
2026-06-12 21:24:09 -04:00
2026-06-11 21:42:52 -04:00
2026-07-01 20:09:01 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-12 21:24:09 -04:00
2026-06-12 21:24:09 -04:00
2026-07-02 11:14:01 -04:00
2026-06-11 21:42:52 -04:00
2026-06-21 13:48:47 -04:00
2026-06-02 18:35:29 -04:00
2026-06-11 21:42:52 -04:00
2026-06-02 18:35:29 -04:00
2026-06-20 13:36:57 -04:00
2026-06-11 21:42:52 -04:00
2026-06-16 21:55:45 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-07-05 14:04:29 -04:00
2026-06-22 23:43:22 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-02 18:35:29 -04:00
2026-07-02 13:01:10 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-02 18:35:29 -04:00
2026-06-11 21:42:52 -04:00
2026-06-02 18:35:29 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-02 18:35:29 -04:00
2026-06-22 00:59:41 -04:00
2026-06-11 21:42:52 -04:00
2026-06-25 15:37:33 -04:00
2026-06-16 21:55:45 -04:00
2026-07-02 13:01:10 -04:00
2026-06-11 21:42:52 -04:00
2026-07-02 11:14:01 -04:00
2026-06-24 14:46:44 -04:00
2026-06-11 21:42:52 -04:00
2026-06-14 15:52:22 -04:00
2026-06-02 18:35:29 -04:00
2026-06-02 18:35:29 -04:00
2026-06-14 12:23:07 -04:00
2026-06-11 21:42:52 -04:00
2026-07-05 14:04:29 -04:00
2026-06-14 20:52:36 -04:00
2026-06-11 21:42:52 -04:00
2026-06-21 22:34:00 -04:00
2026-06-24 17:27:45 -04:00
2026-06-24 13:19:10 -04:00
2026-06-24 17:27:45 -04:00
2026-06-09 12:51:15 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-14 12:23:07 -04:00
2026-06-28 08:15:37 -07:00
2026-06-11 21:42:52 -04:00
2026-06-23 19:04:13 -04:00
2026-06-02 18:35:29 -04:00
2026-06-30 22:21:18 -04:00
2026-06-15 19:57:11 -04:00
2026-06-14 12:51:17 -04:00
2026-06-24 17:27:45 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-07-03 12:18:25 -04:00
2026-07-03 23:21:55 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-11 21:42:52 -04:00
2026-06-02 18:35:29 -04:00
2026-06-28 22:42:44 -04:00
2026-06-24 13:19:10 -04:00
2026-06-11 21:42:52 -04:00
2026-06-24 13:19:10 -04:00
2026-06-11 21:42:52 -04:00
2026-06-02 18:35:29 -04:00
2026-07-04 13:32:51 -04:00
2026-06-12 21:24:09 -04:00
2026-06-29 00:14:32 -04:00
2026-07-02 11:58:06 -04:00