@codyswann/lisa 4.40.1 → 4.41.1

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 +8 -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 +2 -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 +101 -1
package/package.json CHANGED
@@ -171,7 +171,7 @@
171
171
  "zod-validation-error": "^4.0.0"
172
172
  },
173
173
  "name": "@codyswann/lisa",
174
- "version": "4.40.1",
174
+ "version": "4.41.1",
175
175
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
176
176
  "main": "dist/index.js",
177
177
  "exports": {
@@ -319,7 +319,7 @@
319
319
  "test": "tests"
320
320
  },
321
321
  "types": "./dist/index.d.ts",
322
- "lisaReleaseCommit": "ec7fc892e6ac49b4162920b7aecc37157877d4eb",
323
- "gitHead": "ec7fc892e6ac49b4162920b7aecc37157877d4eb",
324
- "lisaReleaseTag": "v4.40.1"
322
+ "lisaReleaseCommit": "f53413636a353ff14e517508836882aa5f36429a",
323
+ "gitHead": "f53413636a353ff14e517508836882aa5f36429a",
324
+ "lisaReleaseTag": "v4.41.1"
325
325
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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.40.1",
3
+ "version": "4.41.1",
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"
@@ -341,6 +341,7 @@ export const VIOLATIONS = Object.freeze({
341
341
  whitespace: "whitespace_in_skip_token",
342
342
  vacuous: "vacuous_required_check",
343
343
  unproven: "unproven_required_check",
344
+ absent: "absent_required_check",
344
345
  reviewWaived: "review_evidence_waived",
345
346
  reviewUnsatisfied: "review_evidence_unsatisfied",
346
347
  });
@@ -1411,6 +1412,92 @@ function evaluateEvidenceBearingCheck(name, entry, checks, context) {
1411
1412
  };
1412
1413
  }
1413
1414
 
1415
+ /**
1416
+ * Every required context that posted NO check-run at all.
1417
+ *
1418
+ * The third member of the family this file's header names, and the one that was
1419
+ * missing. **Skipped** is a check that ran and declined to prove anything;
1420
+ * **vacuous** is one that ran, reported success, and did no work; **absent** is
1421
+ * one that never reported. All three satisfy a merge gate without evidence, and
1422
+ * absence is the quietest because it produces no row for anyone to read.
1423
+ *
1424
+ * MEASURED (CodySwannGT/lisa#3580, on PR #3573): 15 required contexts, 2
1425
+ * reported, 13 absent. The three workflow runs that would have posted them sat
1426
+ * at `conclusion: action_required` with `created_at == updated_at` — parked,
1427
+ * never executed. The pull request rendered as "CI running" for 26 hours.
1428
+ *
1429
+ * **Why the vacuity arm could not see it.** {@link evaluateVacuousChecks}
1430
+ * iterates `evidence_bearing_checks`, which held ONE name on that repository.
1431
+ * `required_contexts` held fifteen. This file already knew the full required
1432
+ * set and spent it only on an annotation — "This context IS ruleset-required" —
1433
+ * attached to findings about the one. Nothing ever walked the fifteen to ask
1434
+ * which of them said nothing. The data was here; the question was not.
1435
+ *
1436
+ * Three properties, each load-bearing:
1437
+ *
1438
+ * - **Absent is not pending.** A check in flight has posted a row and will post
1439
+ * a verdict; an absent one never will. Folding them together is the confusion
1440
+ * that made the stall invisible, so this must not make it in reverse — only a
1441
+ * context with no row at all counts, whatever state the rows carry.
1442
+ * - **No snapshot, no finding.** Without `required_contexts` this cannot know
1443
+ * what was required, and a guard that invented the set would fire on every
1444
+ * repository that has not transcribed one. Absence of knowledge is not
1445
+ * knowledge of absence — the same distinction the arm exists to enforce,
1446
+ * pointed at itself.
1447
+ * - **The parked-run lookup is an ENRICHMENT, never a precondition.** It names
1448
+ * the approval gate when it can, because "absent" alone sends an operator
1449
+ * hunting a broken workflow. But a finding that only reports when it can also
1450
+ * explain would report nothing wherever the explanation is unavailable, which
1451
+ * is the silent failure this was written to end.
1452
+ * @param {object} declaration - The per-repo declaration
1453
+ * @param {ReadonlyArray<{name: string}>} checks - Rows read for the head SHA
1454
+ * @param {object} [options] - `headSha` to cite, `parkedRuns` to explain with
1455
+ * @returns {{violations: object[], checked: number, absent: string[]}} Findings
1456
+ */
1457
+ export function evaluateAbsentRequiredChecks(
1458
+ declaration,
1459
+ checks,
1460
+ options = {}
1461
+ ) {
1462
+ const required = declaration.required_contexts;
1463
+ if (!Array.isArray(required))
1464
+ return { violations: [], checked: 0, absent: [] };
1465
+
1466
+ const at = citeHeadSha(options.headSha);
1467
+ const parked = (options.parkedRuns ?? []).filter(
1468
+ run => String(run?.conclusion ?? "") === "action_required"
1469
+ );
1470
+ // Named once for every finding rather than per context: a parked run posts no
1471
+ // check-run, so nothing ties one run to one absent context. Reporting the
1472
+ // whole parked set against each is honest about that; pretending to a mapping
1473
+ // this data cannot support would be a worse answer than an imprecise one.
1474
+ const approval =
1475
+ parked.length === 0
1476
+ ? ""
1477
+ : ` A workflow run for this head is parked at \`action_required\` and will never complete on its own: ${parked
1478
+ .map(
1479
+ run => `${JSON.stringify(String(run.name ?? ""))} (run ${run.id})`
1480
+ )
1481
+ .join(
1482
+ ", "
1483
+ )}. Approve it with \`gh api -X POST repos/<owner>/<repo>/actions/runs/<id>/approve\`, or the context stays absent indefinitely.`;
1484
+
1485
+ const absent = required.filter(
1486
+ name => checks.find(check => check.name === name) === undefined
1487
+ );
1488
+
1489
+ return {
1490
+ checked: required.length,
1491
+ absent,
1492
+ violations: absent.map(name => ({
1493
+ kind: VIOLATIONS.absent,
1494
+ token: name,
1495
+ contexts: [name],
1496
+ message: `\`${name}\` is ruleset-required but did not report on this pull request at all.${at} It posted NO check-run — not pending, not failing, ABSENT. \`gh pr checks\` prints no line for it and the pull request page renders it exactly as one still in flight, so every surface says "wait" and none says "broken".${approval} (If the context was renamed, fix \`required_contexts\`; names are compared byte for byte.)`,
1497
+ })),
1498
+ };
1499
+ }
1500
+
1414
1501
  /**
1415
1502
  * Descriptions that WAIVE the review gate, matched whole and case-insensitively.
1416
1503
  *
@@ -2810,6 +2897,14 @@ export function inspectVacuity(argv, declaration, options = {}) {
2810
2897
  trustRequiredContexts: options.trustRequiredContexts,
2811
2898
  headSha: read.headSha,
2812
2899
  });
2900
+ // Evaluated on the same rows the vacuity arm just read, so the absence arm
2901
+ // costs no extra fetch. It runs on EVERY invocation for the reason the review
2902
+ // gate does: a finding computed only when somebody opted in is invisible on
2903
+ // exactly the repositories that have not opted in yet.
2904
+ const absent = evaluateAbsentRequiredChecks(declaration, read.checks, {
2905
+ headSha: read.headSha,
2906
+ parkedRuns: options.parkedRuns,
2907
+ });
2813
2908
  // The gate is evaluated on EVERY run, not only when a caller asked it to
2814
2909
  // block. Its findings are what make a waiver visible, and a waiver that is
2815
2910
  // only computed when somebody opted in would be invisible on exactly the
@@ -2841,7 +2936,12 @@ export function inspectVacuity(argv, declaration, options = {}) {
2841
2936
  prSource: source,
2842
2937
  headSha: read.headSha,
2843
2938
  checked: evaluated.checked,
2844
- violations: [...evaluated.violations, ...gate.violations],
2939
+ violations: [
2940
+ ...evaluated.violations,
2941
+ ...absent.violations,
2942
+ ...gate.violations,
2943
+ ],
2944
+ absent: absent.absent,
2845
2945
  gateStates: gate.states,
2846
2946
  gateConditions: gate.conditions,
2847
2947
  gateDescriptions: gate.descriptions,