@codyswann/lisa 4.55.18 → 4.55.19
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/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.js +5 -5
- 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-git-submit-pr/SKILL.md +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +1 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa/skills/lisa-git-submit-pr/SKILL.md +4 -0
- package/plugins/lisa/skills/lisa-implement/SKILL.md +1 -10
- package/plugins/lisa/skills/lisa-jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-git-submit-pr/SKILL.md +4 -0
- package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +1 -10
- package/plugins/lisa-agy/skills/lisa-jira-evidence/scripts/post-evidence.sh +2 -1
- 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-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/skills/lisa-git-submit-pr/SKILL.md +4 -0
- package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +1 -10
- package/plugins/lisa-copilot/skills/lisa-jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-git-submit-pr/SKILL.md +4 -0
- package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +1 -10
- package/plugins/lisa-cursor/skills/lisa-jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-expo/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-agy/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/skills/jira-evidence/scripts/post-evidence.sh +2 -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-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-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-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-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-rails/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-agy/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/skills/jira-evidence/scripts/post-evidence.sh +2 -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-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/src/base/skills/lisa-git-submit-pr/SKILL.md +4 -0
- package/plugins/src/base/skills/lisa-implement/SKILL.md +1 -10
- package/plugins/src/base/skills/lisa-jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/src/expo/skills/jira-evidence/scripts/post-evidence.sh +2 -1
- package/plugins/src/rails/skills/jira-evidence/scripts/post-evidence.sh +2 -1
|
@@ -41,9 +41,9 @@ export const NIGHTLY_E2E_GUARD_BEHAVIOR_CERTIFICATES = Object.freeze({
|
|
|
41
41
|
}),
|
|
42
42
|
cd02b94b4db5134984c7b69f905af71c96bb5aac09a18fb3c6aef5ab0c22cf17: Object.freeze({
|
|
43
43
|
contractVersion: "1.9.0",
|
|
44
|
-
packageVersions: Object.freeze(["4.55.
|
|
44
|
+
packageVersions: Object.freeze(["4.55.19"]),
|
|
45
45
|
provenances: Object.freeze([
|
|
46
|
-
"workspace package @codyswann/lisa@4.55.
|
|
46
|
+
"workspace package @codyswann/lisa@4.55.19 (typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs)",
|
|
47
47
|
]),
|
|
48
48
|
}),
|
|
49
49
|
dfd2fef680de5ef03e63075e8a61c62ca4d95cdfdff6201939b79c748d3397f6: Object.freeze({
|
|
@@ -565,7 +565,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
565
565
|
"plugins/src/base/skills/lisa-generate-claude-remote-build-script/SKILL.md": "214ed34793b9758a65930ef2a79eea8e44ee1f6c85a35b92fbc621cb539e0c69",
|
|
566
566
|
"plugins/src/base/skills/lisa-git-commit/SKILL.md": "2ed235b2bcafa314eb83243edd2ceebd6e241303f5354b7f5766d89046a40bac",
|
|
567
567
|
"plugins/src/base/skills/lisa-git-prune/SKILL.md": "11fad06d109538f1a8ee4ef8043bb0e083672e3c9a7cb7ae8a7233c5411d6dd2",
|
|
568
|
-
"plugins/src/base/skills/lisa-git-submit-pr/SKILL.md": "
|
|
568
|
+
"plugins/src/base/skills/lisa-git-submit-pr/SKILL.md": "395c08ad3e620e27a1c636d784f8051853136cdb409b2a52661f79711ad5edc7",
|
|
569
569
|
"plugins/src/base/skills/lisa-github-add-journey/SKILL.md": "4ceda3474a9b32abae835c2676e8cb2b7e888c6ba04b95843dbe7254293bbf32",
|
|
570
570
|
"plugins/src/base/skills/lisa-github-build-intake/SKILL.md": "64bdbf75ef115752b91a357b6ce04e3a6118bb4899610bc9d9e8d8013638945e",
|
|
571
571
|
"plugins/src/base/skills/lisa-github-claim/SKILL.md": "71301c6d45d7eb5523e74aa7f070bb2becf57ca68fb8bde9e02ee937b78815f7",
|
|
@@ -583,7 +583,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
583
583
|
"plugins/src/base/skills/lisa-github-write-prd/SKILL.md": "303d5bdcd6fb956ebf1f9a479ab3a4a3eadc735973c4146f8cf6bf0751d10869",
|
|
584
584
|
"plugins/src/base/skills/lisa-health-drift-cron/SKILL.md": "852eb7410ce26badc7e441d32d43dc15004431abf413fd702f80b4dc5fff4a89",
|
|
585
585
|
"plugins/src/base/skills/lisa-health/SKILL.md": "dfdb08a863e78bff42671793dcec29cfae0654db18ebf66a4aa77aeb56ddb775",
|
|
586
|
-
"plugins/src/base/skills/lisa-implement/SKILL.md": "
|
|
586
|
+
"plugins/src/base/skills/lisa-implement/SKILL.md": "3094aa138200bd5bfd01629eff881717aa4c4614dc6dc456eab48ac7691b8f25",
|
|
587
587
|
"plugins/src/base/skills/lisa-improve-code-complexity/SKILL.md": "24ab5b193b409db6ee6bee981a1c0a48d08991782d7846116ad01658c8bc1ae8",
|
|
588
588
|
"plugins/src/base/skills/lisa-improve-harness/SKILL.md": "98ad4b896785ac51826969a0ff077ef11c51353f2a2e03444c8b38e6c0363d05",
|
|
589
589
|
"plugins/src/base/skills/lisa-improve-max-lines-per-function/SKILL.md": "95c875950c9848fdaf520a18b9bbb264e33d7347be10170add768e01d9cd8e52",
|
|
@@ -598,7 +598,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
598
598
|
"plugins/src/base/skills/lisa-jira-claim/SKILL.md": "9c4935441a4e6b55df0949178f96e927184c4909bffff8929b39a304bc5ac00a",
|
|
599
599
|
"plugins/src/base/skills/lisa-jira-create/SKILL.md": "77078002d2a16e0b2a65725f4e86b13caa1c43ba193eb37beb5b7da20feed3f1",
|
|
600
600
|
"plugins/src/base/skills/lisa-jira-evidence/SKILL.md": "091149fefcfc51e3cec789082a0a8e21167239da1cf2b684e86224db733d974d",
|
|
601
|
-
"plugins/src/base/skills/lisa-jira-evidence/scripts/post-evidence.sh": "
|
|
601
|
+
"plugins/src/base/skills/lisa-jira-evidence/scripts/post-evidence.sh": "6e2cf31b31d16cd5131f4ccef208705c7e8a969414a17274c9722d072e5aca7d",
|
|
602
602
|
"plugins/src/base/skills/lisa-jira-journey/SKILL.md": "8712a24e0ef39364b9ce60140bdca5800321a129eae541e320a93e2dca3e35ef",
|
|
603
603
|
"plugins/src/base/skills/lisa-jira-journey/scripts/generate-templates.py": "906c6d02d2191f12573a452059d939bb85de6489c86f3626e0a206dd5af7e3b7",
|
|
604
604
|
"plugins/src/base/skills/lisa-jira-journey/scripts/parse-plan.py": "a96fda5de44cd6d65fcc7ecf36aa365766707b77ad68b198062124d31a9238b9",
|
|
@@ -840,7 +840,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
840
840
|
"plugins/src/expo/skills/jira-add-journey/SKILL.md": "f3ee60c6ce8652350d3efadd35a4704f60fde2d527627bf65aac521ad94a9e3a",
|
|
841
841
|
"plugins/src/expo/skills/jira-create/SKILL.md": "0fb4378b7399580e180beaacd22f832af3ff0ddae7c5d7761039bc81832c0c43",
|
|
842
842
|
"plugins/src/expo/skills/jira-evidence/SKILL.md": "2161ad652fe2871483c189934bb8fd38e1ed5469478db2f08fe1ae21092f63b3",
|
|
843
|
-
"plugins/src/expo/skills/jira-evidence/scripts/post-evidence.sh": "
|
|
843
|
+
"plugins/src/expo/skills/jira-evidence/scripts/post-evidence.sh": "6e2cf31b31d16cd5131f4ccef208705c7e8a969414a17274c9722d072e5aca7d",
|
|
844
844
|
"plugins/src/expo/skills/jira-journey/SKILL.md": "f5fecd9f17263f976a7e26d0c47a0d69477da31caaf9e299f5f5eeefbef52c34",
|
|
845
845
|
"plugins/src/expo/skills/jira-journey/scripts/generate-templates.py": "0b86be11aa955aa99e6ac72634e475b2945510b345040cdd3ec47afba6ae3cbf",
|
|
846
846
|
"plugins/src/expo/skills/jira-journey/scripts/parse-plan.py": "4c777dfa36c4c01216906b20a9ce473a764a71e4fccd29aed465403229d8de6d",
|
|
@@ -980,7 +980,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
980
980
|
"plugins/src/rails/skills/jira-add-journey/SKILL.md": "b8ffa83b05ede1ab7f8c5dc7499b35c05f0229dab53e385d87faab55938bd0c5",
|
|
981
981
|
"plugins/src/rails/skills/jira-create/SKILL.md": "789b1ed68e983029e0b57c3eefa90fdce000615d0f23b1699a6d9c0099b4e1d0",
|
|
982
982
|
"plugins/src/rails/skills/jira-evidence/SKILL.md": "a131da5a48db3edfdbaa4d5f5a91b5e5f87ccb9a8bb995cec1e81586d76c5393",
|
|
983
|
-
"plugins/src/rails/skills/jira-evidence/scripts/post-evidence.sh": "
|
|
983
|
+
"plugins/src/rails/skills/jira-evidence/scripts/post-evidence.sh": "6e2cf31b31d16cd5131f4ccef208705c7e8a969414a17274c9722d072e5aca7d",
|
|
984
984
|
"plugins/src/rails/skills/jira-journey/SKILL.md": "c65cf8bcde3dbfe4995d26dcce62067cf1a08314a9ba9ca7f7c1fdd53d61feb6",
|
|
985
985
|
"plugins/src/rails/skills/jira-verify/SKILL.md": "ea7aabc7549639d81a60bf3893965cb11c6261a73d549c5eaaa00fe4f5d83332",
|
|
986
986
|
"plugins/src/rails/skills/ops-check-logs/SKILL.md": "e243eb223398e0ae1f1b5f0db7dda8c8ad8ffdea4ec66b9b38164c76f472ba28",
|
package/package.json
CHANGED
|
@@ -187,7 +187,7 @@
|
|
|
187
187
|
"zod-validation-error": "^4.0.0"
|
|
188
188
|
},
|
|
189
189
|
"name": "@codyswann/lisa",
|
|
190
|
-
"version": "4.55.
|
|
190
|
+
"version": "4.55.19",
|
|
191
191
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
192
192
|
"main": "dist/index.js",
|
|
193
193
|
"exports": {
|
|
@@ -336,7 +336,7 @@
|
|
|
336
336
|
"test": "tests"
|
|
337
337
|
},
|
|
338
338
|
"types": "./dist/index.d.ts",
|
|
339
|
-
"lisaReleaseCommit": "
|
|
340
|
-
"gitHead": "
|
|
341
|
-
"lisaReleaseTag": "v4.55.
|
|
339
|
+
"lisaReleaseCommit": "ec3f3cd911f2d90b71d1c27f267eae6929658f52",
|
|
340
|
+
"gitHead": "ec3f3cd911f2d90b71d1c27f267eae6929658f52",
|
|
341
|
+
"lisaReleaseTag": "v4.55.19"
|
|
342
342
|
}
|
|
@@ -14,6 +14,7 @@ Recognized optional hints:
|
|
|
14
14
|
- `target_branch=<branch>` or `base=<branch>` — intended PR base branch.
|
|
15
15
|
- `tracker_provider=<github|linear|jira|none>` — explicit provider when the ref shape is ambiguous.
|
|
16
16
|
- `pr_url=<url>` — live pull request URL, only needed when updating tracker backlinks from an existing PR context.
|
|
17
|
+
- `local_review=<done|pending>` — default `pending`. Reuse `done` only with a completed review result covering the current branch diff; a remembered review or an unavailable reviewer is insufficient.
|
|
17
18
|
- `auto_merge=<true|false>` — whether the PR should merge automatically. Default `true` (existing behavior for every current caller). This skill **never arms the latch itself** in either mode; it passes the value through to the `drive-pr-to-merge` delegation in step 6, which owns the arm decision. With `auto_merge=false` the PR is driven to a clean, green, OPEN state and then left awaiting a human.
|
|
18
19
|
|
|
19
20
|
## Workflow
|
|
@@ -27,6 +28,9 @@ Recognized optional hints:
|
|
|
27
28
|
|
|
28
29
|
1. **Branch Check**: Verify not on `dev`, `staging`, or `main` (cannot create PR from protected branches)
|
|
29
30
|
2. **Commit Check**: Ensure all changes are committed before pushing
|
|
31
|
+
2a. **Local review before push**: Unless `local_review=done` has current evidence, run `lisa-review-local` over the branch diff, address findings through `convergent-review`, and commit any fixes before step 3. This applies regardless of third-party reviewer availability. Reuse an applicable completed review instead of repeating it.
|
|
32
|
+
|
|
33
|
+
Report the result as *self-reviewed*; it does not satisfy the ruleset-required third-party review check. If the runtime cannot delegate review, record **local review unavailable**, continue under the existing merge policy, and do not pass `local_review=done`. An unavailable review is not a passing review.
|
|
30
34
|
3. **Push**: Push current branch to remote with `-u` flag and the following environment variable - GIT_SSH_COMMAND="ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=5"
|
|
31
35
|
4. **PR Management**:
|
|
32
36
|
- Check for existing PR on this branch
|
|
@@ -346,16 +346,7 @@ Before shutting down the team, execute the Verify flow:
|
|
|
346
346
|
3. Write the highest-practical-observation regression test encoding the verification. For user-visible bugs or user-visible Build changes with an available browser/device/e2e harness, this means a deterministic spec on the reported surface — and for frontend work, once the validation journey is verified, the scenario and its aligned automation for **every platform the scenario requires**, per `codify-verification` and the `bdd-e2e-coverage` rule. Prove the new spec actually executed and passed in PR CI by recording a named spec log/reporter line or equivalent execution record; green CI without that named evidence does not satisfy this step.
|
|
347
347
|
4. Record Implement usage on the originating work artifact via `lisa-usage-accounting` so the work item (or other implementation-owned artifact) gains a direct `lisa-implement` usage entry in the canonical `## Lisa Usage` section. If the parent / child graph is already known, prefer `record_and_rollup` so ancestor totals refresh in the same write; otherwise still write the direct entry, and if runtime usage is unavailable, use `source: unavailable` with nullable token/cost fields instead of skipping the row.
|
|
348
348
|
5. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
349
|
-
6.
|
|
350
|
-
6a. **Review the branch locally BEFORE opening the pull request, every time.** Invoke `lisa-review-local` over the branch diff, triage what it finds under the `convergent-review` rule (same contract as any other reviewer — fix what is valid, refute what is not, on the record), and commit the fixes. Only then proceed to step 7.
|
|
351
|
-
|
|
352
|
-
**Unconditional, not a fallback.** Do not gate this on whether a third-party reviewer is available, rate limited, or skipped. Measured on this repository, 47 of the last 60 merged pull requests carried a review context reporting `SUCCESS` while having read nothing — 29 rate limited, 16 skipped because the vendor does not auto-review public repositories, one skipped on size. A rule that fires only when the vendor is absent has to detect four distinct vacuity strings correctly, forever, and still leaves the vendor being *present but wrong* unguarded. Reviewing always needs no detection at all and makes the third-party review **additive**: its findings still arrive at step 8 and are handled there exactly as today.
|
|
353
|
-
|
|
354
|
-
**Before the pull request, not after it.** Auto-merge is armed at submit time, so the pull request can merge the moment CI goes green — a review that starts after step 7 is racing a latch that is already set. Running here has nothing to race.
|
|
355
|
-
|
|
356
|
-
**A local review is a weaker claim than an independent one, and the report must say so.** The agents reviewing the branch are the same team that wrote it. Record the outcome as *self-reviewed* — never as *reviewed* — and never describe it as satisfying the third-party review check, which is ruleset-required and can only be posted by that vendor's app. Collapsing the two would be the same vacuous-success failure this step exists to remove, one level up.
|
|
357
|
-
|
|
358
|
-
**If no subagent delegation is available in this runtime**, say so explicitly in the completion summary and proceed — but record that no local review was possible. "Could not review" must never be reported as "reviewed and found nothing"; an unavailable check is not a passing one.
|
|
349
|
+
6. Delegate local review and push to `lisa-git-submit-pr` in step 7. Pass `local_review=done` only when a completed review result covers the current branch diff; otherwise omit the hint so submit-pr runs the review. Do not push separately before that review.
|
|
359
350
|
|
|
360
351
|
7. Open a pull request with auto-merge on via `lisa-git-submit-pr`, targeting the **base branch resolved from the ticket's environment** (`target_branch=<base>`, per the branch step above), and including the mandatory work-item ref so the PR can be linked natively to the source issue.
|
|
361
352
|
7a. Confirm two-way linkage before treating PR submission as complete: the PR body/title/branch must reference the work item, and the work item must have either a verified native PR link or the single managed `[lisa-pr-link]` comment. Establish that comment with `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` rather than posting it by hand — it is idempotent, and it is the same file that enforces the check, so producer and consumer cannot drift.
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -14,6 +14,7 @@ Recognized optional hints:
|
|
|
14
14
|
- `target_branch=<branch>` or `base=<branch>` — intended PR base branch.
|
|
15
15
|
- `tracker_provider=<github|linear|jira|none>` — explicit provider when the ref shape is ambiguous.
|
|
16
16
|
- `pr_url=<url>` — live pull request URL, only needed when updating tracker backlinks from an existing PR context.
|
|
17
|
+
- `local_review=<done|pending>` — default `pending`. Reuse `done` only with a completed review result covering the current branch diff; a remembered review or an unavailable reviewer is insufficient.
|
|
17
18
|
- `auto_merge=<true|false>` — whether the PR should merge automatically. Default `true` (existing behavior for every current caller). This skill **never arms the latch itself** in either mode; it passes the value through to the `drive-pr-to-merge` delegation in step 6, which owns the arm decision. With `auto_merge=false` the PR is driven to a clean, green, OPEN state and then left awaiting a human.
|
|
18
19
|
|
|
19
20
|
## Workflow
|
|
@@ -27,6 +28,9 @@ Recognized optional hints:
|
|
|
27
28
|
|
|
28
29
|
1. **Branch Check**: Verify not on `dev`, `staging`, or `main` (cannot create PR from protected branches)
|
|
29
30
|
2. **Commit Check**: Ensure all changes are committed before pushing
|
|
31
|
+
2a. **Local review before push**: Unless `local_review=done` has current evidence, run `lisa-review-local` over the branch diff, address findings through `convergent-review`, and commit any fixes before step 3. This applies regardless of third-party reviewer availability. Reuse an applicable completed review instead of repeating it.
|
|
32
|
+
|
|
33
|
+
Report the result as *self-reviewed*; it does not satisfy the ruleset-required third-party review check. If the runtime cannot delegate review, record **local review unavailable**, continue under the existing merge policy, and do not pass `local_review=done`. An unavailable review is not a passing review.
|
|
30
34
|
3. **Push**: Push current branch to remote with `-u` flag and the following environment variable - GIT_SSH_COMMAND="ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=5"
|
|
31
35
|
4. **PR Management**:
|
|
32
36
|
- Check for existing PR on this branch
|
|
@@ -346,16 +346,7 @@ Before shutting down the team, execute the Verify flow:
|
|
|
346
346
|
3. Write the highest-practical-observation regression test encoding the verification. For user-visible bugs or user-visible Build changes with an available browser/device/e2e harness, this means a deterministic spec on the reported surface — and for frontend work, once the validation journey is verified, the scenario and its aligned automation for **every platform the scenario requires**, per `codify-verification` and the `bdd-e2e-coverage` rule. Prove the new spec actually executed and passed in PR CI by recording a named spec log/reporter line or equivalent execution record; green CI without that named evidence does not satisfy this step.
|
|
347
347
|
4. Record Implement usage on the originating work artifact via `lisa-usage-accounting` so the work item (or other implementation-owned artifact) gains a direct `lisa-implement` usage entry in the canonical `## Lisa Usage` section. If the parent / child graph is already known, prefer `record_and_rollup` so ancestor totals refresh in the same write; otherwise still write the direct entry, and if runtime usage is unavailable, use `source: unavailable` with nullable token/cost fields instead of skipping the row.
|
|
348
348
|
5. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
349
|
-
6.
|
|
350
|
-
6a. **Review the branch locally BEFORE opening the pull request, every time.** Invoke `lisa-review-local` over the branch diff, triage what it finds under the `convergent-review` rule (same contract as any other reviewer — fix what is valid, refute what is not, on the record), and commit the fixes. Only then proceed to step 7.
|
|
351
|
-
|
|
352
|
-
**Unconditional, not a fallback.** Do not gate this on whether a third-party reviewer is available, rate limited, or skipped. Measured on this repository, 47 of the last 60 merged pull requests carried a review context reporting `SUCCESS` while having read nothing — 29 rate limited, 16 skipped because the vendor does not auto-review public repositories, one skipped on size. A rule that fires only when the vendor is absent has to detect four distinct vacuity strings correctly, forever, and still leaves the vendor being *present but wrong* unguarded. Reviewing always needs no detection at all and makes the third-party review **additive**: its findings still arrive at step 8 and are handled there exactly as today.
|
|
353
|
-
|
|
354
|
-
**Before the pull request, not after it.** Auto-merge is armed at submit time, so the pull request can merge the moment CI goes green — a review that starts after step 7 is racing a latch that is already set. Running here has nothing to race.
|
|
355
|
-
|
|
356
|
-
**A local review is a weaker claim than an independent one, and the report must say so.** The agents reviewing the branch are the same team that wrote it. Record the outcome as *self-reviewed* — never as *reviewed* — and never describe it as satisfying the third-party review check, which is ruleset-required and can only be posted by that vendor's app. Collapsing the two would be the same vacuous-success failure this step exists to remove, one level up.
|
|
357
|
-
|
|
358
|
-
**If no subagent delegation is available in this runtime**, say so explicitly in the completion summary and proceed — but record that no local review was possible. "Could not review" must never be reported as "reviewed and found nothing"; an unavailable check is not a passing one.
|
|
349
|
+
6. Delegate local review and push to `lisa-git-submit-pr` in step 7. Pass `local_review=done` only when a completed review result covers the current branch diff; otherwise omit the hint so submit-pr runs the review. Do not push separately before that review.
|
|
359
350
|
|
|
360
351
|
7. Open a pull request with auto-merge on via `lisa-git-submit-pr`, targeting the **base branch resolved from the ticket's environment** (`target_branch=<base>`, per the branch step above), and including the mandatory work-item ref so the PR can be linked natively to the source issue.
|
|
361
352
|
7a. Confirm two-way linkage before treating PR submission as complete: the PR body/title/branch must reference the work item, and the work item must have either a verified native PR link or the single managed `[lisa-pr-link]` comment. Establish that comment with `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` rather than posting it by hand — it is idempotent, and it is the same file that enforces the check, so producer and consumer cannot drift.
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -14,6 +14,7 @@ Recognized optional hints:
|
|
|
14
14
|
- `target_branch=<branch>` or `base=<branch>` — intended PR base branch.
|
|
15
15
|
- `tracker_provider=<github|linear|jira|none>` — explicit provider when the ref shape is ambiguous.
|
|
16
16
|
- `pr_url=<url>` — live pull request URL, only needed when updating tracker backlinks from an existing PR context.
|
|
17
|
+
- `local_review=<done|pending>` — default `pending`. Reuse `done` only with a completed review result covering the current branch diff; a remembered review or an unavailable reviewer is insufficient.
|
|
17
18
|
- `auto_merge=<true|false>` — whether the PR should merge automatically. Default `true` (existing behavior for every current caller). This skill **never arms the latch itself** in either mode; it passes the value through to the `drive-pr-to-merge` delegation in step 6, which owns the arm decision. With `auto_merge=false` the PR is driven to a clean, green, OPEN state and then left awaiting a human.
|
|
18
19
|
|
|
19
20
|
## Workflow
|
|
@@ -27,6 +28,9 @@ Recognized optional hints:
|
|
|
27
28
|
|
|
28
29
|
1. **Branch Check**: Verify not on `dev`, `staging`, or `main` (cannot create PR from protected branches)
|
|
29
30
|
2. **Commit Check**: Ensure all changes are committed before pushing
|
|
31
|
+
2a. **Local review before push**: Unless `local_review=done` has current evidence, run `lisa-review-local` over the branch diff, address findings through `convergent-review`, and commit any fixes before step 3. This applies regardless of third-party reviewer availability. Reuse an applicable completed review instead of repeating it.
|
|
32
|
+
|
|
33
|
+
Report the result as *self-reviewed*; it does not satisfy the ruleset-required third-party review check. If the runtime cannot delegate review, record **local review unavailable**, continue under the existing merge policy, and do not pass `local_review=done`. An unavailable review is not a passing review.
|
|
30
34
|
3. **Push**: Push current branch to remote with `-u` flag and the following environment variable - GIT_SSH_COMMAND="ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=5"
|
|
31
35
|
4. **PR Management**:
|
|
32
36
|
- Check for existing PR on this branch
|
|
@@ -346,16 +346,7 @@ Before shutting down the team, execute the Verify flow:
|
|
|
346
346
|
3. Write the highest-practical-observation regression test encoding the verification. For user-visible bugs or user-visible Build changes with an available browser/device/e2e harness, this means a deterministic spec on the reported surface — and for frontend work, once the validation journey is verified, the scenario and its aligned automation for **every platform the scenario requires**, per `codify-verification` and the `bdd-e2e-coverage` rule. Prove the new spec actually executed and passed in PR CI by recording a named spec log/reporter line or equivalent execution record; green CI without that named evidence does not satisfy this step.
|
|
347
347
|
4. Record Implement usage on the originating work artifact via `lisa-usage-accounting` so the work item (or other implementation-owned artifact) gains a direct `lisa-implement` usage entry in the canonical `## Lisa Usage` section. If the parent / child graph is already known, prefer `record_and_rollup` so ancestor totals refresh in the same write; otherwise still write the direct entry, and if runtime usage is unavailable, use `source: unavailable` with nullable token/cost fields instead of skipping the row.
|
|
348
348
|
5. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
349
|
-
6.
|
|
350
|
-
6a. **Review the branch locally BEFORE opening the pull request, every time.** Invoke `lisa-review-local` over the branch diff, triage what it finds under the `convergent-review` rule (same contract as any other reviewer — fix what is valid, refute what is not, on the record), and commit the fixes. Only then proceed to step 7.
|
|
351
|
-
|
|
352
|
-
**Unconditional, not a fallback.** Do not gate this on whether a third-party reviewer is available, rate limited, or skipped. Measured on this repository, 47 of the last 60 merged pull requests carried a review context reporting `SUCCESS` while having read nothing — 29 rate limited, 16 skipped because the vendor does not auto-review public repositories, one skipped on size. A rule that fires only when the vendor is absent has to detect four distinct vacuity strings correctly, forever, and still leaves the vendor being *present but wrong* unguarded. Reviewing always needs no detection at all and makes the third-party review **additive**: its findings still arrive at step 8 and are handled there exactly as today.
|
|
353
|
-
|
|
354
|
-
**Before the pull request, not after it.** Auto-merge is armed at submit time, so the pull request can merge the moment CI goes green — a review that starts after step 7 is racing a latch that is already set. Running here has nothing to race.
|
|
355
|
-
|
|
356
|
-
**A local review is a weaker claim than an independent one, and the report must say so.** The agents reviewing the branch are the same team that wrote it. Record the outcome as *self-reviewed* — never as *reviewed* — and never describe it as satisfying the third-party review check, which is ruleset-required and can only be posted by that vendor's app. Collapsing the two would be the same vacuous-success failure this step exists to remove, one level up.
|
|
357
|
-
|
|
358
|
-
**If no subagent delegation is available in this runtime**, say so explicitly in the completion summary and proceed — but record that no local review was possible. "Could not review" must never be reported as "reviewed and found nothing"; an unavailable check is not a passing one.
|
|
349
|
+
6. Delegate local review and push to `lisa-git-submit-pr` in step 7. Pass `local_review=done` only when a completed review result covers the current branch diff; otherwise omit the hint so submit-pr runs the review. Do not push separately before that review.
|
|
359
350
|
|
|
360
351
|
7. Open a pull request with auto-merge on via `lisa-git-submit-pr`, targeting the **base branch resolved from the ticket's environment** (`target_branch=<base>`, per the branch step above), and including the mandatory work-item ref so the PR can be linked natively to the source issue.
|
|
361
352
|
7a. Confirm two-way linkage before treating PR submission as complete: the PR body/title/branch must reference the work item, and the work item must have either a verified native PR link or the single managed `[lisa-pr-link]` comment. Establish that comment with `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` rather than posting it by hand — it is idempotent, and it is the same file that enforces the check, so producer and consumer cannot drift.
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -14,6 +14,7 @@ Recognized optional hints:
|
|
|
14
14
|
- `target_branch=<branch>` or `base=<branch>` — intended PR base branch.
|
|
15
15
|
- `tracker_provider=<github|linear|jira|none>` — explicit provider when the ref shape is ambiguous.
|
|
16
16
|
- `pr_url=<url>` — live pull request URL, only needed when updating tracker backlinks from an existing PR context.
|
|
17
|
+
- `local_review=<done|pending>` — default `pending`. Reuse `done` only with a completed review result covering the current branch diff; a remembered review or an unavailable reviewer is insufficient.
|
|
17
18
|
- `auto_merge=<true|false>` — whether the PR should merge automatically. Default `true` (existing behavior for every current caller). This skill **never arms the latch itself** in either mode; it passes the value through to the `drive-pr-to-merge` delegation in step 6, which owns the arm decision. With `auto_merge=false` the PR is driven to a clean, green, OPEN state and then left awaiting a human.
|
|
18
19
|
|
|
19
20
|
## Workflow
|
|
@@ -27,6 +28,9 @@ Recognized optional hints:
|
|
|
27
28
|
|
|
28
29
|
1. **Branch Check**: Verify not on `dev`, `staging`, or `main` (cannot create PR from protected branches)
|
|
29
30
|
2. **Commit Check**: Ensure all changes are committed before pushing
|
|
31
|
+
2a. **Local review before push**: Unless `local_review=done` has current evidence, run `lisa-review-local` over the branch diff, address findings through `convergent-review`, and commit any fixes before step 3. This applies regardless of third-party reviewer availability. Reuse an applicable completed review instead of repeating it.
|
|
32
|
+
|
|
33
|
+
Report the result as *self-reviewed*; it does not satisfy the ruleset-required third-party review check. If the runtime cannot delegate review, record **local review unavailable**, continue under the existing merge policy, and do not pass `local_review=done`. An unavailable review is not a passing review.
|
|
30
34
|
3. **Push**: Push current branch to remote with `-u` flag and the following environment variable - GIT_SSH_COMMAND="ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=5"
|
|
31
35
|
4. **PR Management**:
|
|
32
36
|
- Check for existing PR on this branch
|
|
@@ -346,16 +346,7 @@ Before shutting down the team, execute the Verify flow:
|
|
|
346
346
|
3. Write the highest-practical-observation regression test encoding the verification. For user-visible bugs or user-visible Build changes with an available browser/device/e2e harness, this means a deterministic spec on the reported surface — and for frontend work, once the validation journey is verified, the scenario and its aligned automation for **every platform the scenario requires**, per `codify-verification` and the `bdd-e2e-coverage` rule. Prove the new spec actually executed and passed in PR CI by recording a named spec log/reporter line or equivalent execution record; green CI without that named evidence does not satisfy this step.
|
|
347
347
|
4. Record Implement usage on the originating work artifact via `lisa-usage-accounting` so the work item (or other implementation-owned artifact) gains a direct `lisa-implement` usage entry in the canonical `## Lisa Usage` section. If the parent / child graph is already known, prefer `record_and_rollup` so ancestor totals refresh in the same write; otherwise still write the direct entry, and if runtime usage is unavailable, use `source: unavailable` with nullable token/cost fields instead of skipping the row.
|
|
348
348
|
5. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
349
|
-
6.
|
|
350
|
-
6a. **Review the branch locally BEFORE opening the pull request, every time.** Invoke `lisa-review-local` over the branch diff, triage what it finds under the `convergent-review` rule (same contract as any other reviewer — fix what is valid, refute what is not, on the record), and commit the fixes. Only then proceed to step 7.
|
|
351
|
-
|
|
352
|
-
**Unconditional, not a fallback.** Do not gate this on whether a third-party reviewer is available, rate limited, or skipped. Measured on this repository, 47 of the last 60 merged pull requests carried a review context reporting `SUCCESS` while having read nothing — 29 rate limited, 16 skipped because the vendor does not auto-review public repositories, one skipped on size. A rule that fires only when the vendor is absent has to detect four distinct vacuity strings correctly, forever, and still leaves the vendor being *present but wrong* unguarded. Reviewing always needs no detection at all and makes the third-party review **additive**: its findings still arrive at step 8 and are handled there exactly as today.
|
|
353
|
-
|
|
354
|
-
**Before the pull request, not after it.** Auto-merge is armed at submit time, so the pull request can merge the moment CI goes green — a review that starts after step 7 is racing a latch that is already set. Running here has nothing to race.
|
|
355
|
-
|
|
356
|
-
**A local review is a weaker claim than an independent one, and the report must say so.** The agents reviewing the branch are the same team that wrote it. Record the outcome as *self-reviewed* — never as *reviewed* — and never describe it as satisfying the third-party review check, which is ruleset-required and can only be posted by that vendor's app. Collapsing the two would be the same vacuous-success failure this step exists to remove, one level up.
|
|
357
|
-
|
|
358
|
-
**If no subagent delegation is available in this runtime**, say so explicitly in the completion summary and proceed — but record that no local review was possible. "Could not review" must never be reported as "reviewed and found nothing"; an unavailable check is not a passing one.
|
|
349
|
+
6. Delegate local review and push to `lisa-git-submit-pr` in step 7. Pass `local_review=done` only when a completed review result covers the current branch diff; otherwise omit the hint so submit-pr runs the review. Do not push separately before that review.
|
|
359
350
|
|
|
360
351
|
7. Open a pull request with auto-merge on via `lisa-git-submit-pr`, targeting the **base branch resolved from the ticket's environment** (`target_branch=<base>`, per the branch step above), and including the mandatory work-item ref so the PR can be linked natively to the source issue.
|
|
361
352
|
7a. Confirm two-way linkage before treating PR submission as complete: the PR body/title/branch must reference the work item, and the work item must have either a verified native PR link or the single managed `[lisa-pr-link]` comment. Establish that comment with `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` rather than posting it by hand — it is idempotent, and it is the same file that enforces the check, so producer and consumer cannot drift.
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -14,6 +14,7 @@ Recognized optional hints:
|
|
|
14
14
|
- `target_branch=<branch>` or `base=<branch>` — intended PR base branch.
|
|
15
15
|
- `tracker_provider=<github|linear|jira|none>` — explicit provider when the ref shape is ambiguous.
|
|
16
16
|
- `pr_url=<url>` — live pull request URL, only needed when updating tracker backlinks from an existing PR context.
|
|
17
|
+
- `local_review=<done|pending>` — default `pending`. Reuse `done` only with a completed review result covering the current branch diff; a remembered review or an unavailable reviewer is insufficient.
|
|
17
18
|
- `auto_merge=<true|false>` — whether the PR should merge automatically. Default `true` (existing behavior for every current caller). This skill **never arms the latch itself** in either mode; it passes the value through to the `drive-pr-to-merge` delegation in step 6, which owns the arm decision. With `auto_merge=false` the PR is driven to a clean, green, OPEN state and then left awaiting a human.
|
|
18
19
|
|
|
19
20
|
## Workflow
|
|
@@ -27,6 +28,9 @@ Recognized optional hints:
|
|
|
27
28
|
|
|
28
29
|
1. **Branch Check**: Verify not on `dev`, `staging`, or `main` (cannot create PR from protected branches)
|
|
29
30
|
2. **Commit Check**: Ensure all changes are committed before pushing
|
|
31
|
+
2a. **Local review before push**: Unless `local_review=done` has current evidence, run `lisa-review-local` over the branch diff, address findings through `convergent-review`, and commit any fixes before step 3. This applies regardless of third-party reviewer availability. Reuse an applicable completed review instead of repeating it.
|
|
32
|
+
|
|
33
|
+
Report the result as *self-reviewed*; it does not satisfy the ruleset-required third-party review check. If the runtime cannot delegate review, record **local review unavailable**, continue under the existing merge policy, and do not pass `local_review=done`. An unavailable review is not a passing review.
|
|
30
34
|
3. **Push**: Push current branch to remote with `-u` flag and the following environment variable - GIT_SSH_COMMAND="ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=5"
|
|
31
35
|
4. **PR Management**:
|
|
32
36
|
- Check for existing PR on this branch
|
|
@@ -346,16 +346,7 @@ Before shutting down the team, execute the Verify flow:
|
|
|
346
346
|
3. Write the highest-practical-observation regression test encoding the verification. For user-visible bugs or user-visible Build changes with an available browser/device/e2e harness, this means a deterministic spec on the reported surface — and for frontend work, once the validation journey is verified, the scenario and its aligned automation for **every platform the scenario requires**, per `codify-verification` and the `bdd-e2e-coverage` rule. Prove the new spec actually executed and passed in PR CI by recording a named spec log/reporter line or equivalent execution record; green CI without that named evidence does not satisfy this step.
|
|
347
347
|
4. Record Implement usage on the originating work artifact via `lisa-usage-accounting` so the work item (or other implementation-owned artifact) gains a direct `lisa-implement` usage entry in the canonical `## Lisa Usage` section. If the parent / child graph is already known, prefer `record_and_rollup` so ancestor totals refresh in the same write; otherwise still write the direct entry, and if runtime usage is unavailable, use `source: unavailable` with nullable token/cost fields instead of skipping the row.
|
|
348
348
|
5. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
349
|
-
6.
|
|
350
|
-
6a. **Review the branch locally BEFORE opening the pull request, every time.** Invoke `lisa-review-local` over the branch diff, triage what it finds under the `convergent-review` rule (same contract as any other reviewer — fix what is valid, refute what is not, on the record), and commit the fixes. Only then proceed to step 7.
|
|
351
|
-
|
|
352
|
-
**Unconditional, not a fallback.** Do not gate this on whether a third-party reviewer is available, rate limited, or skipped. Measured on this repository, 47 of the last 60 merged pull requests carried a review context reporting `SUCCESS` while having read nothing — 29 rate limited, 16 skipped because the vendor does not auto-review public repositories, one skipped on size. A rule that fires only when the vendor is absent has to detect four distinct vacuity strings correctly, forever, and still leaves the vendor being *present but wrong* unguarded. Reviewing always needs no detection at all and makes the third-party review **additive**: its findings still arrive at step 8 and are handled there exactly as today.
|
|
353
|
-
|
|
354
|
-
**Before the pull request, not after it.** Auto-merge is armed at submit time, so the pull request can merge the moment CI goes green — a review that starts after step 7 is racing a latch that is already set. Running here has nothing to race.
|
|
355
|
-
|
|
356
|
-
**A local review is a weaker claim than an independent one, and the report must say so.** The agents reviewing the branch are the same team that wrote it. Record the outcome as *self-reviewed* — never as *reviewed* — and never describe it as satisfying the third-party review check, which is ruleset-required and can only be posted by that vendor's app. Collapsing the two would be the same vacuous-success failure this step exists to remove, one level up.
|
|
357
|
-
|
|
358
|
-
**If no subagent delegation is available in this runtime**, say so explicitly in the completion summary and proceed — but record that no local review was possible. "Could not review" must never be reported as "reviewed and found nothing"; an unavailable check is not a passing one.
|
|
349
|
+
6. Delegate local review and push to `lisa-git-submit-pr` in step 7. Pass `local_review=done` only when a completed review result covers the current branch diff; otherwise omit the hint so submit-pr runs the review. Do not push separately before that review.
|
|
359
350
|
|
|
360
351
|
7. Open a pull request with auto-merge on via `lisa-git-submit-pr`, targeting the **base branch resolved from the ticket's environment** (`target_branch=<base>`, per the branch step above), and including the mandatory work-item ref so the PR can be linked natively to the source issue.
|
|
361
352
|
7a. Confirm two-way linkage before treating PR submission as complete: the PR body/title/branch must reference the work item, and the work item must have either a verified native PR link or the single managed `[lisa-pr-link]` comment. Establish that comment with `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` rather than posting it by hand — it is idempotent, and it is the same file that enforces the check, so producer and consumer cannot drift.
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.55.
|
|
3
|
+
"version": "4.55.19",
|
|
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.55.
|
|
3
|
+
"version": "4.55.19",
|
|
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.55.
|
|
3
|
+
"version": "4.55.19",
|
|
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.55.
|
|
3
|
+
"version": "4.55.19",
|
|
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.55.
|
|
3
|
+
"version": "4.55.19",
|
|
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"
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -14,6 +14,7 @@ Recognized optional hints:
|
|
|
14
14
|
- `target_branch=<branch>` or `base=<branch>` — intended PR base branch.
|
|
15
15
|
- `tracker_provider=<github|linear|jira|none>` — explicit provider when the ref shape is ambiguous.
|
|
16
16
|
- `pr_url=<url>` — live pull request URL, only needed when updating tracker backlinks from an existing PR context.
|
|
17
|
+
- `local_review=<done|pending>` — default `pending`. Reuse `done` only with a completed review result covering the current branch diff; a remembered review or an unavailable reviewer is insufficient.
|
|
17
18
|
- `auto_merge=<true|false>` — whether the PR should merge automatically. Default `true` (existing behavior for every current caller). This skill **never arms the latch itself** in either mode; it passes the value through to the `drive-pr-to-merge` delegation in step 6, which owns the arm decision. With `auto_merge=false` the PR is driven to a clean, green, OPEN state and then left awaiting a human.
|
|
18
19
|
|
|
19
20
|
## Workflow
|
|
@@ -27,6 +28,9 @@ Recognized optional hints:
|
|
|
27
28
|
|
|
28
29
|
1. **Branch Check**: Verify not on `dev`, `staging`, or `main` (cannot create PR from protected branches)
|
|
29
30
|
2. **Commit Check**: Ensure all changes are committed before pushing
|
|
31
|
+
2a. **Local review before push**: Unless `local_review=done` has current evidence, run `lisa-review-local` over the branch diff, address findings through `convergent-review`, and commit any fixes before step 3. This applies regardless of third-party reviewer availability. Reuse an applicable completed review instead of repeating it.
|
|
32
|
+
|
|
33
|
+
Report the result as *self-reviewed*; it does not satisfy the ruleset-required third-party review check. If the runtime cannot delegate review, record **local review unavailable**, continue under the existing merge policy, and do not pass `local_review=done`. An unavailable review is not a passing review.
|
|
30
34
|
3. **Push**: Push current branch to remote with `-u` flag and the following environment variable - GIT_SSH_COMMAND="ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=5"
|
|
31
35
|
4. **PR Management**:
|
|
32
36
|
- Check for existing PR on this branch
|
|
@@ -346,16 +346,7 @@ Before shutting down the team, execute the Verify flow:
|
|
|
346
346
|
3. Write the highest-practical-observation regression test encoding the verification. For user-visible bugs or user-visible Build changes with an available browser/device/e2e harness, this means a deterministic spec on the reported surface — and for frontend work, once the validation journey is verified, the scenario and its aligned automation for **every platform the scenario requires**, per `codify-verification` and the `bdd-e2e-coverage` rule. Prove the new spec actually executed and passed in PR CI by recording a named spec log/reporter line or equivalent execution record; green CI without that named evidence does not satisfy this step.
|
|
347
347
|
4. Record Implement usage on the originating work artifact via `lisa-usage-accounting` so the work item (or other implementation-owned artifact) gains a direct `lisa-implement` usage entry in the canonical `## Lisa Usage` section. If the parent / child graph is already known, prefer `record_and_rollup` so ancestor totals refresh in the same write; otherwise still write the direct entry, and if runtime usage is unavailable, use `source: unavailable` with nullable token/cost fields instead of skipping the row.
|
|
348
348
|
5. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
349
|
-
6.
|
|
350
|
-
6a. **Review the branch locally BEFORE opening the pull request, every time.** Invoke `lisa-review-local` over the branch diff, triage what it finds under the `convergent-review` rule (same contract as any other reviewer — fix what is valid, refute what is not, on the record), and commit the fixes. Only then proceed to step 7.
|
|
351
|
-
|
|
352
|
-
**Unconditional, not a fallback.** Do not gate this on whether a third-party reviewer is available, rate limited, or skipped. Measured on this repository, 47 of the last 60 merged pull requests carried a review context reporting `SUCCESS` while having read nothing — 29 rate limited, 16 skipped because the vendor does not auto-review public repositories, one skipped on size. A rule that fires only when the vendor is absent has to detect four distinct vacuity strings correctly, forever, and still leaves the vendor being *present but wrong* unguarded. Reviewing always needs no detection at all and makes the third-party review **additive**: its findings still arrive at step 8 and are handled there exactly as today.
|
|
353
|
-
|
|
354
|
-
**Before the pull request, not after it.** Auto-merge is armed at submit time, so the pull request can merge the moment CI goes green — a review that starts after step 7 is racing a latch that is already set. Running here has nothing to race.
|
|
355
|
-
|
|
356
|
-
**A local review is a weaker claim than an independent one, and the report must say so.** The agents reviewing the branch are the same team that wrote it. Record the outcome as *self-reviewed* — never as *reviewed* — and never describe it as satisfying the third-party review check, which is ruleset-required and can only be posted by that vendor's app. Collapsing the two would be the same vacuous-success failure this step exists to remove, one level up.
|
|
357
|
-
|
|
358
|
-
**If no subagent delegation is available in this runtime**, say so explicitly in the completion summary and proceed — but record that no local review was possible. "Could not review" must never be reported as "reviewed and found nothing"; an unavailable check is not a passing one.
|
|
349
|
+
6. Delegate local review and push to `lisa-git-submit-pr` in step 7. Pass `local_review=done` only when a completed review result covers the current branch diff; otherwise omit the hint so submit-pr runs the review. Do not push separately before that review.
|
|
359
350
|
|
|
360
351
|
7. Open a pull request with auto-merge on via `lisa-git-submit-pr`, targeting the **base branch resolved from the ticket's environment** (`target_branch=<base>`, per the branch step above), and including the mandatory work-item ref so the PR can be linked natively to the source issue.
|
|
361
352
|
7a. Confirm two-way linkage before treating PR submission as complete: the PR body/title/branch must reference the work item, and the work item must have either a verified native PR link or the single managed `[lisa-pr-link]` comment. Establish that comment with `node scripts/lisa-work-item.mjs backlink --ref <work_item_ref> --pr-url <url>` rather than posting it by hand — it is idempotent, and it is the same file that enforces the check, so producer and consumer cannot drift.
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|
|
@@ -124,7 +124,8 @@ while IFS= read -r -d '' f; do
|
|
|
124
124
|
TEXT_EVIDENCE+=("$f")
|
|
125
125
|
done < <(find "$EVIDENCE_DIR" -maxdepth 1 \( -name '[0-9][0-9]-*.txt' -o -name '[0-9][0-9]-*.json' \) ! -name 'comment.txt' -print0 | sort -z)
|
|
126
126
|
|
|
127
|
-
|
|
127
|
+
# Bash 3.2 treats an empty array as unset under nounset.
|
|
128
|
+
ALL_EVIDENCE=(${SCREENSHOTS[@]+"${SCREENSHOTS[@]}"} ${TEXT_EVIDENCE[@]+"${TEXT_EVIDENCE[@]}"})
|
|
128
129
|
|
|
129
130
|
if [[ ${#ALL_EVIDENCE[@]} -eq 0 ]]; then
|
|
130
131
|
echo "ERROR: No numbered evidence files found in $EVIDENCE_DIR (expected NN-*.png, NN-*.txt, or NN-*.json)" >&2
|