@codyswann/lisa 4.87.5 → 4.87.6

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 (106) hide show
  1. package/all/copy-overwrite/scripts/check-third-party-review-evidence.mjs +568 -80
  2. package/dist/cli/doctor-seeded-artifacts.d.ts.map +1 -1
  3. package/dist/cli/doctor-seeded-artifacts.js +10 -3
  4. package/dist/cli/doctor-seeded-artifacts.js.map +1 -1
  5. package/dist/cli/doctor-third-party-evidence-seed.d.ts +32 -0
  6. package/dist/cli/doctor-third-party-evidence-seed.d.ts.map +1 -0
  7. package/dist/cli/doctor-third-party-evidence-seed.js +239 -0
  8. package/dist/cli/doctor-third-party-evidence-seed.js.map +1 -0
  9. package/dist/cli/doctor.js +2 -2
  10. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  11. package/dist/core/lisa-owned-hash-ledger.js +6 -0
  12. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  13. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  14. package/dist/core/third-party-evidence-seed.d.ts +42 -0
  15. package/dist/core/third-party-evidence-seed.d.ts.map +1 -0
  16. package/dist/core/third-party-evidence-seed.js +233 -0
  17. package/dist/core/third-party-evidence-seed.js.map +1 -0
  18. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  19. package/dist/core/upstream-evidence-manifest.js +21 -4
  20. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  21. package/package.json +4 -4
  22. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  24. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
  25. package/plugins/lisa/.codex-plugin/skills/lisa-pull-request-review/SKILL.md +11 -5
  26. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
  27. package/plugins/lisa/skills/lisa-pull-request-review/SKILL.md +11 -5
  28. package/plugins/lisa-agy/plugin.json +1 -1
  29. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
  30. package/plugins/lisa-agy/skills/lisa-pull-request-review/SKILL.md +11 -5
  31. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  33. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  34. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-cdk-devin/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-cdk-devin/.devin-plugin/plugin.json +1 -1
  38. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
  40. package/plugins/lisa-copilot/skills/lisa-pull-request-review/SKILL.md +11 -5
  41. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
  43. package/plugins/lisa-cursor/skills/lisa-pull-request-review/SKILL.md +11 -5
  44. package/plugins/lisa-devin/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-devin/.devin-plugin/plugin.json +1 -1
  46. package/plugins/lisa-devin/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
  47. package/plugins/lisa-devin/skills/lisa-pull-request-review/SKILL.md +11 -5
  48. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-expo-agy/plugin.json +1 -1
  51. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-expo-devin/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-expo-devin/.devin-plugin/plugin.json +1 -1
  55. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  58. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-harper-fabric-devin/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-harper-fabric-devin/.devin-plugin/plugin.json +1 -1
  62. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  65. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-nestjs-devin/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-nestjs-devin/.devin-plugin/plugin.json +1 -1
  69. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  72. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-openclaw-devin/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-openclaw-devin/.devin-plugin/plugin.json +1 -1
  76. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  79. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-phaser-devin/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-phaser-devin/.devin-plugin/plugin.json +1 -1
  83. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  85. package/plugins/lisa-rails-agy/plugin.json +1 -1
  86. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-rails-devin/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-rails-devin/.devin-plugin/plugin.json +1 -1
  90. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  92. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  93. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-typescript-devin/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-typescript-devin/.devin-plugin/plugin.json +1 -1
  97. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  99. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  100. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  101. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  102. package/plugins/lisa-wiki-devin/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-wiki-devin/.devin-plugin/plugin.json +1 -1
  104. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
  105. package/plugins/src/base/skills/lisa-pull-request-review/SKILL.md +11 -5
  106. package/typescript/create-only/.github/workflows/third-party-review-evidence.yml +62 -30
@@ -56,11 +56,17 @@ gh pr checks <pr> --json name,state,bucket,description \
56
56
  --jq '.[] | select(.name | test("(?i)coderabbit|review")) | "\(.name)\t\(.state)\t\(.description)"'
57
57
  ```
58
58
 
59
- **The state column reads `SUCCESS` whether the review was real or hollow — only
60
- the description distinguishes them.** `Review approved` / `Review completed` is
61
- a real review; `Review rate limited`, `Review queued`, or a missing context is
62
- not. Never read `gh pr view --json statusCheckRollup` for this: CodeRabbit posts
63
- a legacy commit status, which that route returns *without* the description.
59
+ **The state column passes whether the review was real or hollow — only the
60
+ reviewer's words distinguish them.** For a commit status those words are the
61
+ description: `Review approved` / `Review completed` is a real review;
62
+ `Review rate limited`, `Review queued`, or a missing context is not. A reviewer
63
+ can also report through a **check run** instead, and then this command cannot
64
+ tell you anything: the description column is empty for a check run, which
65
+ reads `SUCCESS` when it reviewed and `NEUTRAL` — still passing a required
66
+ check — when it was throttled. The run's result is the first line of its
67
+ summary, so use `node scripts/check-third-party-review-evidence.mjs --sha <head-sha> --json`,
68
+ which reads both representations. Never read `gh pr view --json statusCheckRollup`
69
+ for this: it returns a commit status *without* its description.
64
70
 
65
71
  Where the project ships Lisa's guard, prefer its machine-readable form, which
66
72
  also says whether the check is ruleset-required (so whether branch protection
@@ -6,42 +6,61 @@
6
6
  # `review-evidence.yml` answers "can the gate SEE a review that never happened?"
7
7
  # This one answers "and then what?".
8
8
  #
9
- # A third-party review app posts a COMMIT STATUS on the pull request head. When
10
- # it is throttled or declines, it still reports `state: success` — it never
11
- # blocks. Only the `description` separates a review that ran from one that never
12
- # started. Measured over the last 30 merged pull requests in the repository this
13
- # was written against: 24 of 30 merges passed a required review gate that
14
- # reviewed nothing, every one of them `success`.
9
+ # A third-party review app reports on the pull request head through a COMMIT
10
+ # STATUS or a CHECK RUN, and one app can move from the first to the second
11
+ # without notice (#4553). When it is throttled or declines, it never blocks: a
12
+ # status still reports `state: success`, and a check run concludes `neutral`,
13
+ # which GitHub counts as passing a required check. Only the words separate a
14
+ # review that ran from one that never started — a status's `description`, or
15
+ # the first line of a check run's summary. Measured over the last 30 merged pull
16
+ # requests in the repository this was written against: 24 of 30 merges passed a
17
+ # required review gate that reviewed nothing.
15
18
  #
16
- # WHY `on: status` AND NOT A POLLING LOOP. The verdict changes the moment the
17
- # reviewer posts, and only then. A schedule that polled for it would burn
18
- # billable minutes on every repository, every interval, to learn nothing on
19
- # almost every run. This wakes on the event that carries the answer, does one
20
- # API read, decides, and exits.
19
+ # WHY `status` AND `check_run`, AND NOT A POLLING LOOP. The verdict changes
20
+ # the moment the reviewer answers, and only then. A schedule that polled for it
21
+ # would burn billable minutes on every repository, every interval, to learn
22
+ # nothing on almost every run. This wakes on the event that carries the answer,
23
+ # reads it, decides, and exits. A check run fires no `status` event, so a
24
+ # workflow that woke on `status` alone stopped running entirely the day its
25
+ # reviewer switched (#4553). GitHub starts a `check_run` workflow only from the
26
+ # default branch's copy of this file, and never when the check suite was created
27
+ # by GitHub Actions or its head SHA is associated with GitHub Actions — so the
28
+ # reviewer's run wakes it and Actions' own jobs do not, and no check run on a
29
+ # head pushed with the Actions token wakes it either.
21
30
  #
22
- # WHY THE JOB DOES NOT CREATE A STATUS. Creating one would be a `status` event,
23
- # and this workflow triggers on `status`. Nothing here writes a status; the
24
- # verdict is the run's own exit code.
31
+ # WHY THE DEFAULT BRANCH IS CHECKED OUT, NEVER THE HEAD. `status` and
32
+ # `check_run` runs start in this repository's own context, for every pull
33
+ # request — a fork's included — with no approval prompt, and any app's check
34
+ # run starts one. Checking out the head would run that pull request's own code,
35
+ # and its own `.lisa.config.json`, with this repository's token and cache
36
+ # scope. The prover reads the head's evidence through the API by SHA, so it
37
+ # never needs the head's files: the commit to judge arrives as --sha.
38
+ #
39
+ # NOTHING IN THE JOB POSTS A STATUS OR A CHECK RUN. The verdict is the job's
40
+ # own conclusion. The job's own check run belongs to a suite GitHub Actions
41
+ # created, which by the rule above never starts this workflow again.
25
42
  #
26
43
  # WHAT MAKES IT RED. Neither real third-party review evidence at the head, nor a
27
44
  # posted adversarial-review substitute for that same head. A merge path that
28
45
  # substitutes a local review leaves a marked comment behind, and this reads it.
29
46
  #
30
47
  # THREE NO-OPS THAT SAY SO. No reviewer configured, a commit that is nobody's
31
- # pull request head, and a status from an app nobody declared are all no-ops —
32
- # and each PRINTS that it is one. A silent pass is the defect this exists to
33
- # end, so it is not reproduced here.
48
+ # pull request head, and a status or check run from an app nobody declared are
49
+ # all no-ops — and each PRINTS that it is one. A silent pass is the defect this
50
+ # exists to end, so it is not reproduced here.
34
51
  #
35
52
  # AND ONE DEFERRAL. A declared reviewer still `pending` has not answered yet:
36
53
  # measured, a reviewer posts `Review queued` then `Review in progress` before
37
54
  # the verdict, up to seven statuses on one head. Judging the first would report
38
55
  # a finding on 100% of pull requests, and a guard that fires every time gets
39
- # deleted rather than read. The settled status fires its own event.
56
+ # deleted rather than read. The settled status fires its own event; a check
57
+ # run wakes this only once it has `completed`.
40
58
  #
41
- # THE TWO ARMS COVER DIFFERENT HALVES. This one wakes on a status and catches a
42
- # reviewer that ANSWERED HOLLOW. `review-evidence.yml` runs on the pull-request
43
- # event and catches a reviewer that NEVER ANSWERED, which produces no status and
44
- # therefore no event here. Neither replaces the other.
59
+ # THE TWO ARMS COVER DIFFERENT HALVES. This one wakes on the reviewer's answer
60
+ # and catches a reviewer that ANSWERED HOLLOW. `review-evidence.yml` runs on the
61
+ # pull-request event and catches a reviewer that NEVER ANSWERED, which produces
62
+ # no status or check run and therefore no event here. Neither replaces the
63
+ # other.
45
64
  #
46
65
  # NOTHING RE-REQUESTS A REVIEW. Re-requesting OVERWRITES the existing status
47
66
  # rather than adding to it, so under a throttle it destroys a real review,
@@ -51,6 +70,8 @@ name: 🕵️ Third-Party Review Evidence
51
70
 
52
71
  on:
53
72
  status:
73
+ check_run:
74
+ types: [completed]
54
75
  workflow_dispatch:
55
76
  inputs:
56
77
  sha:
@@ -58,15 +79,22 @@ on:
58
79
  required: true
59
80
  type: string
60
81
 
61
- # `statuses: read` is the only route that carries a description at all;
62
- # `pull-requests: read` finds the head pull request and its comments.
82
+ # A reviewer's words arrive by two routes: a status's description needs
83
+ # `statuses: read` (the status rollup drops it entirely), and a check run's
84
+ # summary needs `checks: read`. `pull-requests: read` finds the head pull
85
+ # request and its comments.
63
86
  permissions:
64
87
  contents: read
65
88
  statuses: read
89
+ checks: read
66
90
  pull-requests: read
67
91
 
92
+ # One run per event, head and reviewer. The reviewer and the event are part of
93
+ # the key as well as the commit, so neither another app's check run nor a
94
+ # pending status settling on the same head can cancel the run that is judging
95
+ # the reviewer's answer.
68
96
  concurrency:
69
- group: third-party-review-evidence-${{ github.event.sha || inputs.sha }}
97
+ group: third-party-review-evidence-${{ github.event_name }}-${{ github.event.check_run.head_sha || github.event.sha || inputs.sha }}-${{ github.event.check_run.name || github.event.context }}
70
98
  cancel-in-progress: true
71
99
 
72
100
  jobs:
@@ -74,16 +102,18 @@ jobs:
74
102
  name: 🕵️ Was this head reviewed, or reviewed for?
75
103
  # A pending status is the reviewer saying it has started, which is not yet
76
104
  # an answer. Judging it would report a finding on every pull request, and a
77
- # guard that fires every time gets deleted rather than read.
78
- if: github.event_name == 'workflow_dispatch' || github.event.state != 'pending'
105
+ # guard that fires every time gets deleted rather than read. A check run
106
+ # wakes this only once completed, and a manual run always proceeds.
107
+ if: github.event_name != 'status' || github.event.state != 'pending'
79
108
  runs-on: ubuntu-latest
80
109
  timeout-minutes: 5
81
110
 
82
111
  steps:
112
+ # No `ref:`. This checks out the default branch on `status` and
113
+ # `check_run`, never the pull request's head — see the header.
83
114
  - name: 📥 Checkout repository
84
115
  uses: actions/checkout@v6
85
116
  with:
86
- ref: ${{ github.event.sha || inputs.sha }}
87
117
  persist-credentials: false
88
118
 
89
119
  - name: 🔧 Setup Node.js
@@ -96,10 +126,12 @@ jobs:
96
126
  env:
97
127
  GH_TOKEN: ${{ github.token }}
98
128
  GITHUB_REPOSITORY: ${{ github.repository }}
99
- EVIDENCE_SHA: ${{ github.event.sha || inputs.sha }}
129
+ # The commit and the reviewer come from whichever event woke the
130
+ # run: a check run's head and name, or a status's commit and context.
131
+ EVIDENCE_SHA: ${{ github.event.check_run.head_sha || github.event.sha || inputs.sha }}
100
132
  # Empty on the manual path, where nothing woke the run and every
101
133
  # declared reviewer is evaluated.
102
- EVIDENCE_CONTEXT: ${{ github.event.context }}
134
+ EVIDENCE_CONTEXT: ${{ github.event.check_run.name || github.event.context }}
103
135
  run: |
104
136
  set -eu
105
137
  script=scripts/check-third-party-review-evidence.mjs