@codyswann/lisa 4.45.15 → 4.45.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  2. package/dist/core/lisa-owned-hash-ledger.js +2 -0
  3. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  4. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  5. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  6. package/dist/core/upstream-evidence-manifest.js +4 -1
  7. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  8. package/package.json +4 -4
  9. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  11. package/plugins/lisa-agy/plugin.json +1 -1
  12. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  15. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  21. package/plugins/lisa-expo-agy/plugin.json +1 -1
  22. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  27. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  32. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  37. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  42. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-rails-agy/plugin.json +1 -1
  47. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  52. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  57. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  59. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +53 -17
package/package.json CHANGED
@@ -176,7 +176,7 @@
176
176
  "zod-validation-error": "^4.0.0"
177
177
  },
178
178
  "name": "@codyswann/lisa",
179
- "version": "4.45.15",
179
+ "version": "4.45.17",
180
180
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
181
181
  "main": "dist/index.js",
182
182
  "exports": {
@@ -324,7 +324,7 @@
324
324
  "test": "tests"
325
325
  },
326
326
  "types": "./dist/index.d.ts",
327
- "lisaReleaseCommit": "f4a6bf0e06faa6e1db0bf7b65a076cd707e62d4b",
328
- "gitHead": "f4a6bf0e06faa6e1db0bf7b65a076cd707e62d4b",
329
- "lisaReleaseTag": "v4.45.15"
327
+ "lisaReleaseCommit": "53295857b272a117727fd228c2fb27334b292cee",
328
+ "gitHead": "53295857b272a117727fd228c2fb27334b292cee",
329
+ "lisaReleaseTag": "v4.45.17"
330
330
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.45.15",
3
+ "version": "4.45.17",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -484,6 +484,45 @@ export const NEVER_BLOCKING = Object.freeze([
484
484
  VIOLATIONS.reviewCarried,
485
485
  ]);
486
486
 
487
+ /**
488
+ * Kinds that stay report-only under EVERY flag, including `--fail-on-vacuous`.
489
+ *
490
+ * ## Why this is a named array rather than a condition
491
+ *
492
+ * These two are also members of {@link NEVER_BLOCKING}, and that array's own
493
+ * rule is `return policy.failOnVacuous` — so reaching it would make them block
494
+ * the moment the flag is passed. They were kept apart by an `if` immediately
495
+ * above the lookup, which meant **deleting or reordering one line silently
496
+ * converted two deliberately report-only findings into build failures**, with
497
+ * nothing in the suite noticing (CodySwannGT/lisa#3902). Naming the set makes
498
+ * the exemption a value that can be asserted rather than a position that
499
+ * happens to come first.
500
+ *
501
+ * The behaviour is unchanged: same two kinds, same answer, same place in the
502
+ * order. Only the reason it holds moved from a line's position into a name.
503
+ *
504
+ * ## The two policies, which are different and both deliberate
505
+ *
506
+ * `reviewWaived` is report-only under the owner's ruling on
507
+ * CodySwannGT/lisa#3221. A waived pull request is an unreviewed one, the
508
+ * operator must see it, and it must never fail the build. `--fail-on-vacuous`
509
+ * governs checks that claimed success without proving work; it must not turn a
510
+ * vendor entitlement waiver into a failure through a shared array.
511
+ *
512
+ * `reviewCarried` (CodySwannGT/lisa#3658) is report-only for a second reason on
513
+ * top of that one: it is about ANOTHER pull request, whose own gate already
514
+ * reached its own verdict on its own diff. `--fail-on-vacuous` asks "did the
515
+ * checks on THIS pull request prove their work?", and answering it with a
516
+ * constituent's condition would fail an author for a diff they did not write
517
+ * and cannot change.
518
+ *
519
+ * Changing either policy is out of scope here; this records that they hold.
520
+ */
521
+ export const REPORT_ONLY = Object.freeze([
522
+ VIOLATIONS.reviewWaived,
523
+ VIOLATIONS.reviewCarried,
524
+ ]);
525
+
487
526
  /**
488
527
  * Kinds the review gate blocks on, and only when a caller asks it to.
489
528
  *
@@ -3436,11 +3475,17 @@ function writeGuardError(argv, error) {
3436
3475
  /**
3437
3476
  * Reads the CLI switches that change which findings block.
3438
3477
  *
3478
+ * Exported so a test can prove `--fail-on-vacuous` reaches `failOnVacuous`.
3479
+ * Without that, a case asserting a finding does NOT block under the flag
3480
+ * cannot tell "the flag was live and chose not to block" from "the flag never
3481
+ * arrived" — and the second is the vacuous test this whole file is about
3482
+ * (CodySwannGT/lisa#3902).
3483
+ *
3439
3484
  * @param {ReadonlyArray<string>} argv - Arguments
3440
3485
  * @param {object} result - Guard result
3441
3486
  * @returns {{warnOnly: boolean, failOnVacuous: boolean, requireReviewEvidence: boolean}} Active policy
3442
3487
  */
3443
- function cliPolicy(argv, result) {
3488
+ export function cliPolicy(argv, result) {
3444
3489
  return {
3445
3490
  warnOnly: result.enforcement === "warn",
3446
3491
  // The supported alternative to a per-consumer `--json` wrapper.
@@ -3454,29 +3499,20 @@ function cliPolicy(argv, result) {
3454
3499
  /**
3455
3500
  * True when one violation blocks under the active CLI policy.
3456
3501
  *
3502
+ * Exported for the same reason `cliPolicy` is: the property
3503
+ * CodySwannGT/lisa#3902 asks for is a MATRIX — two kinds that must not block
3504
+ * under `--fail-on-vacuous` beside two that must — and a suite that could
3505
+ * produce only one half of it would pass while the other half rotted.
3506
+ *
3457
3507
  * @param {{kind: string}} violation - One violation
3458
3508
  * @param {{warnOnly: boolean, failOnVacuous: boolean, requireReviewEvidence: boolean}} policy - Active policy
3459
3509
  * @returns {boolean} True when the finding blocks
3460
3510
  */
3461
- function violationBlocks(violation, policy) {
3511
+ export function violationBlocks(violation, policy) {
3462
3512
  if (REVIEW_GATE_BLOCKING.includes(violation.kind)) {
3463
3513
  return policy.requireReviewEvidence;
3464
3514
  }
3465
- // A named waiver is report-only under every flag. `--fail-on-vacuous`
3466
- // governs checks that claimed success without proving work; it must not
3467
- // turn a vendor entitlement waiver into a failure through a shared array.
3468
- //
3469
- // A carried finding (#3658) is report-only for a second reason on top of
3470
- // that one: it is about ANOTHER pull request, whose own gate already
3471
- // reached its own verdict on its own diff. `--fail-on-vacuous` asks "did
3472
- // the checks on THIS pull request prove their work?", and answering it with
3473
- // a constituent's condition would fail an author for a diff they did not
3474
- // write and cannot change.
3475
- if (
3476
- violation.kind === VIOLATIONS.reviewWaived ||
3477
- violation.kind === VIOLATIONS.reviewCarried
3478
- )
3479
- return false;
3515
+ if (REPORT_ONLY.includes(violation.kind)) return false;
3480
3516
  if (NEVER_BLOCKING.includes(violation.kind)) return policy.failOnVacuous;
3481
3517
  return !policy.warnOnly || ALWAYS_BLOCKING.includes(violation.kind);
3482
3518
  }