@codyswann/lisa 4.87.5 → 4.87.7
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.
- package/all/copy-overwrite/scripts/check-third-party-review-evidence.mjs +568 -80
- package/dist/cli/doctor-seeded-artifacts.d.ts.map +1 -1
- package/dist/cli/doctor-seeded-artifacts.js +10 -3
- package/dist/cli/doctor-seeded-artifacts.js.map +1 -1
- package/dist/cli/doctor-third-party-evidence-seed.d.ts +32 -0
- package/dist/cli/doctor-third-party-evidence-seed.d.ts.map +1 -0
- package/dist/cli/doctor-third-party-evidence-seed.js +239 -0
- package/dist/cli/doctor-third-party-evidence-seed.js.map +1 -0
- package/dist/cli/doctor.js +2 -2
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +6 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/third-party-evidence-seed.d.ts +42 -0
- package/dist/core/third-party-evidence-seed.d.ts.map +1 -0
- package/dist/core/third-party-evidence-seed.js +233 -0
- package/dist/core/third-party-evidence-seed.js.map +1 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +23 -4
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
- package/plugins/lisa/.codex-plugin/skills/lisa-pull-request-review/SKILL.md +11 -5
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
- package/plugins/lisa/skills/lisa-pull-request-review/SKILL.md +11 -5
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
- package/plugins/lisa-agy/skills/lisa-pull-request-review/SKILL.md +11 -5
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
- package/plugins/lisa-copilot/skills/lisa-pull-request-review/SKILL.md +11 -5
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
- package/plugins/lisa-cursor/skills/lisa-pull-request-review/SKILL.md +11 -5
- package/plugins/lisa-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-devin/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
- package/plugins/lisa-devin/skills/lisa-pull-request-review/SKILL.md +11 -5
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-devin/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-devin/.devin-plugin/plugin.json +1 -1
- package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +59 -31
- package/plugins/src/base/skills/lisa-pull-request-review/SKILL.md +11 -5
- 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
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
a
|
|
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
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
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 `
|
|
17
|
-
# reviewer
|
|
18
|
-
# billable minutes on every repository, every interval, to learn
|
|
19
|
-
# almost every run. This wakes on the event that carries the answer,
|
|
20
|
-
#
|
|
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
|
|
23
|
-
#
|
|
24
|
-
#
|
|
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
|
|
32
|
-
# and each PRINTS that it is one. A silent pass is the defect this
|
|
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
|
|
42
|
-
# reviewer that ANSWERED HOLLOW. `review-evidence.yml` runs on the
|
|
43
|
-
# event and catches a reviewer that NEVER ANSWERED, which produces
|
|
44
|
-
# therefore no event here. Neither replaces the
|
|
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
|
-
#
|
|
62
|
-
# `
|
|
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
|
-
|
|
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
|
-
|
|
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
|