@codyswann/lisa 2.225.0 → 2.225.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +44 -12
  5. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +17 -7
  6. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +17 -7
  7. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +17 -7
  8. package/plugins/lisa/skills/lisa-doctor/SKILL.md +44 -12
  9. package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +17 -7
  10. package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +17 -7
  11. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +17 -7
  12. package/plugins/lisa-agy/plugin.json +1 -1
  13. package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +44 -12
  14. package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +17 -7
  15. package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +17 -7
  16. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +17 -7
  17. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  20. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +44 -12
  24. package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +17 -7
  25. package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +17 -7
  26. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +17 -7
  27. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +44 -12
  29. package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +17 -7
  30. package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +17 -7
  31. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +17 -7
  32. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-expo-agy/plugin.json +1 -1
  35. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  45. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  50. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  55. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails-agy/plugin.json +1 -1
  60. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  65. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  70. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/src/base/skills/lisa-doctor/SKILL.md +44 -12
  73. package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +17 -7
  74. package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +17 -7
  75. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +17 -7
  76. package/typescript/copy-overwrite/.github/GITHUB_ACTIONS.md +6 -7
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -307,31 +307,63 @@ pull Lisa's own git history and read what actually changed:
307
307
 
308
308
  ```bash
309
309
  gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
310
- --paginate --slurp \
311
- --jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
310
+ --paginate --slurp |
311
+ jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | {sha, subject: (.commit.message | split("\n")[0]), api_url: .url, html_url, parents: [.parents[]?.sha]}]}'
312
312
  ```
313
313
 
314
314
  `--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
315
- array before `--jq` runs without `--slurp`, `--jq` applies per page and prints one JSON object
316
- per page instead of one merged result. `total_commits` and `files` only need the first page
317
- (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
315
+ array before the external `jq` projection runs. GitHub CLI does not permit its built-in `--jq`
316
+ flag together with `--slurp`, so keep the pipe as shown; without `--slurp`, paginated responses
317
+ are not one merged input. `total_commits` and `files` only need the first page
318
+ (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages
319
+ while retaining each commit SHA and URLs needed for accurate follow-up.
320
+
321
+ After path-scoping identifies a candidate commit, fetch its targeted file-level diff context by
322
+ the retained SHA rather than attributing from the subject alone:
323
+
324
+ ```bash
325
+ gh api "repos/CodySwannGT/lisa/commits/<sha>" \
326
+ --jq '{sha, files: [.files[]? | select(.filename == "<relevant-path>" or (.filename | startswith("<relevant-prefix>/"))) | {filename, status, additions, deletions, changes, patch}]}'
327
+ ```
328
+
329
+ Preserve the returned filename, status, counts, and available patch with the SHA in the
330
+ upstream-history projection. A missing or truncated `patch` is not proof of no relevant change;
331
+ use the compare diff fallback below or downgrade attribution to `WARN` when commit-level context
332
+ cannot be established.
318
333
 
319
334
  The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
320
335
  on the first page, capped at 300 total — a large version window can silently drop commits or
321
336
  files. If `total_commits` or the file count looks truncated, re-run with the
322
337
  `application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
323
- to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
338
+ to pull the full patch text, or fall back to the bounded-fetch `git log` below. When completeness
324
339
  still can't be established, say so in the finding and mark it `WARN` rather than attributing
325
340
  drift with unverified confidence.
326
341
 
327
342
  Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
328
343
  path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
329
- window, so treat its output as best-effort context only, not authoritative attribution; a shallow
330
- clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
331
- <paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
332
- the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
333
- only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
334
- observability note — never fail the audit because history was unavailable or incomplete.
344
+ window, so treat its output as best-effort context only, not authoritative attribution; a
345
+ finite-depth, explicit-tag fetch, which is bounded to the two version refs and should be preferred
346
+ for definitive attribution; or the local marketplace/plugin cache checkout when the runtime has
347
+ one. For the fetch fallback, use a temporary directory and a fixed history ceiling:
348
+
349
+ ```bash
350
+ lisa_history_dir="$(mktemp -d)"
351
+ git init "$lisa_history_dir"
352
+ git -C "$lisa_history_dir" remote add origin https://github.com/CodySwannGT/lisa.git
353
+ git -C "$lisa_history_dir" fetch --no-tags --filter=blob:none --depth=256 origin \
354
+ refs/tags/v<installed>:refs/tags/v<installed> \
355
+ refs/tags/v<latest>:refs/tags/v<latest>
356
+ git -C "$lisa_history_dir" merge-base --is-ancestor v<installed> v<latest>
357
+ git -C "$lisa_history_dir" log --format='%H%x09%s' v<installed>..v<latest> -- <paths>
358
+ git -C "$lisa_history_dir" show --format=fuller --stat --patch <relevant-sha> -- <paths>
359
+ ```
360
+
361
+ The explicit tag refspecs, `--no-tags`, and finite `--depth=256` make this fetch bounded. Do not
362
+ silently deepen beyond that ceiling. If `merge-base --is-ancestor` fails, the shallow window is
363
+ incomplete (or the tags are not on one ancestry line): do not make definitive attribution from
364
+ it. If none of the bounded sources are reachable, or only the unbounded path-scoped fallback is
365
+ reachable, report the gap as a `WARN`-level observability note — never fail the audit because
366
+ history was unavailable or incomplete.
335
367
  3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
336
368
  generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
337
369
  `plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
@@ -366,13 +366,23 @@ reach every external surface the work requires. Enumerate the surfaces this issu
366
366
  alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
367
367
  - tooling the work plainly implies (a deploy target, a database, a third-party API).
368
368
 
369
- For each surface, prove **read** access from the current runtime with the cheapest read-only probe
370
- through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
371
- (`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
372
- the linked artifact. Attempt to resolve a gap before failing an alternate substrate, a configured
373
- access layer, a keychain credential mirroring the intake agent's discover-first duty.
374
-
375
- - `PASS` every required surface is provably readable.
369
+ For each surface, prove **read** access from the current runtime with a target-resource-specific,
370
+ read-only probe through its sanctioned access layer: the matching MCP tool or `lisa-*-access` skill,
371
+ or an authenticated fetch using environment-injected authentication. Identity-only commands such as
372
+ `aws sts get-caller-identity`, `gh auth status`, and vendor equivalents are preflight checks only;
373
+ they never satisfy F5 by themselves. A successful probe for one surface does not cover another:
374
+ reading the named GitHub repository, CloudWatch log group, Sentry project, or linked document must
375
+ each succeed separately when that surface is required.
376
+
377
+ Attempt to resolve a gap before failing, but only through another configured brokered access layer
378
+ or environment-injected authentication. A sanctioned broker may use its own credential store
379
+ internally; the validator must never autonomously inspect, read, copy, print, or export raw
380
+ credentials, keychains, credential files, or token stores, and must never invoke low-level secret
381
+ tools to recover them. This preserves the intake agent's discover-first duty without exposing
382
+ credential material.
383
+
384
+ - `PASS` — every required surface has its own successful target-resource read probe or authenticated
385
+ fetch through the sanctioned access layer.
376
386
  - `N/A` — the issue needs nothing beyond the repository and the tracker itself.
377
387
  - `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
378
388
  and what was probed. Intake callers must route this to `blocked` + human escalation with the
@@ -297,13 +297,23 @@ reach every external surface the work requires. Enumerate the surfaces this item
297
297
  alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
298
298
  - tooling the work plainly implies (a deploy target, a database, a third-party API).
299
299
 
300
- For each surface, prove **read** access from the current runtime with the cheapest read-only probe
301
- through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
302
- (`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
303
- the linked artifact. Attempt to resolve a gap before failing an alternate substrate, a configured
304
- access layer, a keychain credential mirroring the intake agent's discover-first duty.
305
-
306
- - `PASS` every required surface is provably readable.
300
+ For each surface, prove **read** access from the current runtime with a target-resource-specific,
301
+ read-only probe through its sanctioned access layer: the matching MCP tool or `lisa-*-access` skill,
302
+ or an authenticated fetch using environment-injected authentication. Identity-only commands such as
303
+ `aws sts get-caller-identity`, `gh auth status`, and vendor equivalents are preflight checks only;
304
+ they never satisfy F5 by themselves. A successful probe for one surface does not cover another:
305
+ reading the named GitHub repository, CloudWatch log group, Sentry project, or linked document must
306
+ each succeed separately when that surface is required.
307
+
308
+ Attempt to resolve a gap before failing, but only through another configured brokered access layer
309
+ or environment-injected authentication. A sanctioned broker may use its own credential store
310
+ internally; the validator must never autonomously inspect, read, copy, print, or export raw
311
+ credentials, keychains, credential files, or token stores, and must never invoke low-level secret
312
+ tools to recover them. This preserves the intake agent's discover-first duty without exposing
313
+ credential material.
314
+
315
+ - `PASS` — every required surface has its own successful target-resource read probe or authenticated
316
+ fetch through the sanctioned access layer.
307
317
  - `N/A` — the item needs nothing beyond the repository and the tracker itself.
308
318
  - `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
309
319
  and what was probed. Intake callers must route this to `blocked` + human escalation with the
@@ -303,13 +303,23 @@ reach every external surface the work requires. Enumerate the surfaces this item
303
303
  alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
304
304
  - tooling the work plainly implies (a deploy target, a database, a third-party API).
305
305
 
306
- For each surface, prove **read** access from the current runtime with the cheapest read-only probe
307
- through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
308
- (`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
309
- the linked artifact. Attempt to resolve a gap before failing an alternate substrate, a configured
310
- access layer, a keychain credential mirroring the intake agent's discover-first duty.
311
-
312
- - `PASS` every required surface is provably readable.
306
+ For each surface, prove **read** access from the current runtime with a target-resource-specific,
307
+ read-only probe through its sanctioned access layer: the matching MCP tool or `lisa-*-access` skill,
308
+ or an authenticated fetch using environment-injected authentication. Identity-only commands such as
309
+ `aws sts get-caller-identity`, `gh auth status`, and vendor equivalents are preflight checks only;
310
+ they never satisfy F5 by themselves. A successful probe for one surface does not cover another:
311
+ reading the named GitHub repository, CloudWatch log group, Sentry project, or linked document must
312
+ each succeed separately when that surface is required.
313
+
314
+ Attempt to resolve a gap before failing, but only through another configured brokered access layer
315
+ or environment-injected authentication. A sanctioned broker may use its own credential store
316
+ internally; the validator must never autonomously inspect, read, copy, print, or export raw
317
+ credentials, keychains, credential files, or token stores, and must never invoke low-level secret
318
+ tools to recover them. This preserves the intake agent's discover-first duty without exposing
319
+ credential material.
320
+
321
+ - `PASS` — every required surface has its own successful target-resource read probe or authenticated
322
+ fetch through the sanctioned access layer.
313
323
  - `N/A` — the item needs nothing beyond the repository and the tracker itself.
314
324
  - `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
315
325
  and what was probed. Intake callers must route this to `blocked` + human escalation with the
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -307,31 +307,63 @@ pull Lisa's own git history and read what actually changed:
307
307
 
308
308
  ```bash
309
309
  gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
310
- --paginate --slurp \
311
- --jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
310
+ --paginate --slurp |
311
+ jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | {sha, subject: (.commit.message | split("\n")[0]), api_url: .url, html_url, parents: [.parents[]?.sha]}]}'
312
312
  ```
313
313
 
314
314
  `--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
315
- array before `--jq` runs without `--slurp`, `--jq` applies per page and prints one JSON object
316
- per page instead of one merged result. `total_commits` and `files` only need the first page
317
- (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
315
+ array before the external `jq` projection runs. GitHub CLI does not permit its built-in `--jq`
316
+ flag together with `--slurp`, so keep the pipe as shown; without `--slurp`, paginated responses
317
+ are not one merged input. `total_commits` and `files` only need the first page
318
+ (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages
319
+ while retaining each commit SHA and URLs needed for accurate follow-up.
320
+
321
+ After path-scoping identifies a candidate commit, fetch its targeted file-level diff context by
322
+ the retained SHA rather than attributing from the subject alone:
323
+
324
+ ```bash
325
+ gh api "repos/CodySwannGT/lisa/commits/<sha>" \
326
+ --jq '{sha, files: [.files[]? | select(.filename == "<relevant-path>" or (.filename | startswith("<relevant-prefix>/"))) | {filename, status, additions, deletions, changes, patch}]}'
327
+ ```
328
+
329
+ Preserve the returned filename, status, counts, and available patch with the SHA in the
330
+ upstream-history projection. A missing or truncated `patch` is not proof of no relevant change;
331
+ use the compare diff fallback below or downgrade attribution to `WARN` when commit-level context
332
+ cannot be established.
318
333
 
319
334
  The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
320
335
  on the first page, capped at 300 total — a large version window can silently drop commits or
321
336
  files. If `total_commits` or the file count looks truncated, re-run with the
322
337
  `application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
323
- to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
338
+ to pull the full patch text, or fall back to the bounded-fetch `git log` below. When completeness
324
339
  still can't be established, say so in the finding and mark it `WARN` rather than attributing
325
340
  drift with unverified confidence.
326
341
 
327
342
  Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
328
343
  path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
329
- window, so treat its output as best-effort context only, not authoritative attribution; a shallow
330
- clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
331
- <paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
332
- the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
333
- only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
334
- observability note — never fail the audit because history was unavailable or incomplete.
344
+ window, so treat its output as best-effort context only, not authoritative attribution; a
345
+ finite-depth, explicit-tag fetch, which is bounded to the two version refs and should be preferred
346
+ for definitive attribution; or the local marketplace/plugin cache checkout when the runtime has
347
+ one. For the fetch fallback, use a temporary directory and a fixed history ceiling:
348
+
349
+ ```bash
350
+ lisa_history_dir="$(mktemp -d)"
351
+ git init "$lisa_history_dir"
352
+ git -C "$lisa_history_dir" remote add origin https://github.com/CodySwannGT/lisa.git
353
+ git -C "$lisa_history_dir" fetch --no-tags --filter=blob:none --depth=256 origin \
354
+ refs/tags/v<installed>:refs/tags/v<installed> \
355
+ refs/tags/v<latest>:refs/tags/v<latest>
356
+ git -C "$lisa_history_dir" merge-base --is-ancestor v<installed> v<latest>
357
+ git -C "$lisa_history_dir" log --format='%H%x09%s' v<installed>..v<latest> -- <paths>
358
+ git -C "$lisa_history_dir" show --format=fuller --stat --patch <relevant-sha> -- <paths>
359
+ ```
360
+
361
+ The explicit tag refspecs, `--no-tags`, and finite `--depth=256` make this fetch bounded. Do not
362
+ silently deepen beyond that ceiling. If `merge-base --is-ancestor` fails, the shallow window is
363
+ incomplete (or the tags are not on one ancestry line): do not make definitive attribution from
364
+ it. If none of the bounded sources are reachable, or only the unbounded path-scoped fallback is
365
+ reachable, report the gap as a `WARN`-level observability note — never fail the audit because
366
+ history was unavailable or incomplete.
335
367
  3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
336
368
  generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
337
369
  `plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
@@ -366,13 +366,23 @@ reach every external surface the work requires. Enumerate the surfaces this issu
366
366
  alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
367
367
  - tooling the work plainly implies (a deploy target, a database, a third-party API).
368
368
 
369
- For each surface, prove **read** access from the current runtime with the cheapest read-only probe
370
- through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
371
- (`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
372
- the linked artifact. Attempt to resolve a gap before failing an alternate substrate, a configured
373
- access layer, a keychain credential mirroring the intake agent's discover-first duty.
374
-
375
- - `PASS` every required surface is provably readable.
369
+ For each surface, prove **read** access from the current runtime with a target-resource-specific,
370
+ read-only probe through its sanctioned access layer: the matching MCP tool or `lisa-*-access` skill,
371
+ or an authenticated fetch using environment-injected authentication. Identity-only commands such as
372
+ `aws sts get-caller-identity`, `gh auth status`, and vendor equivalents are preflight checks only;
373
+ they never satisfy F5 by themselves. A successful probe for one surface does not cover another:
374
+ reading the named GitHub repository, CloudWatch log group, Sentry project, or linked document must
375
+ each succeed separately when that surface is required.
376
+
377
+ Attempt to resolve a gap before failing, but only through another configured brokered access layer
378
+ or environment-injected authentication. A sanctioned broker may use its own credential store
379
+ internally; the validator must never autonomously inspect, read, copy, print, or export raw
380
+ credentials, keychains, credential files, or token stores, and must never invoke low-level secret
381
+ tools to recover them. This preserves the intake agent's discover-first duty without exposing
382
+ credential material.
383
+
384
+ - `PASS` — every required surface has its own successful target-resource read probe or authenticated
385
+ fetch through the sanctioned access layer.
376
386
  - `N/A` — the issue needs nothing beyond the repository and the tracker itself.
377
387
  - `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
378
388
  and what was probed. Intake callers must route this to `blocked` + human escalation with the
@@ -297,13 +297,23 @@ reach every external surface the work requires. Enumerate the surfaces this item
297
297
  alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
298
298
  - tooling the work plainly implies (a deploy target, a database, a third-party API).
299
299
 
300
- For each surface, prove **read** access from the current runtime with the cheapest read-only probe
301
- through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
302
- (`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
303
- the linked artifact. Attempt to resolve a gap before failing an alternate substrate, a configured
304
- access layer, a keychain credential mirroring the intake agent's discover-first duty.
305
-
306
- - `PASS` every required surface is provably readable.
300
+ For each surface, prove **read** access from the current runtime with a target-resource-specific,
301
+ read-only probe through its sanctioned access layer: the matching MCP tool or `lisa-*-access` skill,
302
+ or an authenticated fetch using environment-injected authentication. Identity-only commands such as
303
+ `aws sts get-caller-identity`, `gh auth status`, and vendor equivalents are preflight checks only;
304
+ they never satisfy F5 by themselves. A successful probe for one surface does not cover another:
305
+ reading the named GitHub repository, CloudWatch log group, Sentry project, or linked document must
306
+ each succeed separately when that surface is required.
307
+
308
+ Attempt to resolve a gap before failing, but only through another configured brokered access layer
309
+ or environment-injected authentication. A sanctioned broker may use its own credential store
310
+ internally; the validator must never autonomously inspect, read, copy, print, or export raw
311
+ credentials, keychains, credential files, or token stores, and must never invoke low-level secret
312
+ tools to recover them. This preserves the intake agent's discover-first duty without exposing
313
+ credential material.
314
+
315
+ - `PASS` — every required surface has its own successful target-resource read probe or authenticated
316
+ fetch through the sanctioned access layer.
307
317
  - `N/A` — the item needs nothing beyond the repository and the tracker itself.
308
318
  - `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
309
319
  and what was probed. Intake callers must route this to `blocked` + human escalation with the
@@ -303,13 +303,23 @@ reach every external surface the work requires. Enumerate the surfaces this item
303
303
  alarms", "pull the copy from the Google Doc", "check the Sentry issues"),
304
304
  - tooling the work plainly implies (a deploy target, a database, a third-party API).
305
305
 
306
- For each surface, prove **read** access from the current runtime with the cheapest read-only probe
307
- through the sanctioned access layer: the matching MCP tool or `lisa-*-access` skill, CLI auth
308
- (`aws sts get-caller-identity`, `gh auth status`, vendor equivalents), or an authenticated fetch of
309
- the linked artifact. Attempt to resolve a gap before failing an alternate substrate, a configured
310
- access layer, a keychain credential mirroring the intake agent's discover-first duty.
311
-
312
- - `PASS` every required surface is provably readable.
306
+ For each surface, prove **read** access from the current runtime with a target-resource-specific,
307
+ read-only probe through its sanctioned access layer: the matching MCP tool or `lisa-*-access` skill,
308
+ or an authenticated fetch using environment-injected authentication. Identity-only commands such as
309
+ `aws sts get-caller-identity`, `gh auth status`, and vendor equivalents are preflight checks only;
310
+ they never satisfy F5 by themselves. A successful probe for one surface does not cover another:
311
+ reading the named GitHub repository, CloudWatch log group, Sentry project, or linked document must
312
+ each succeed separately when that surface is required.
313
+
314
+ Attempt to resolve a gap before failing, but only through another configured brokered access layer
315
+ or environment-injected authentication. A sanctioned broker may use its own credential store
316
+ internally; the validator must never autonomously inspect, read, copy, print, or export raw
317
+ credentials, keychains, credential files, or token stores, and must never invoke low-level secret
318
+ tools to recover them. This preserves the intake agent's discover-first duty without exposing
319
+ credential material.
320
+
321
+ - `PASS` — every required surface has its own successful target-resource read probe or authenticated
322
+ fetch through the sanctioned access layer.
313
323
  - `N/A` — the item needs nothing beyond the repository and the tracker itself.
314
324
  - `FAIL` — a required surface is unreachable after the resolution attempt. Name the exact surface
315
325
  and what was probed. Intake callers must route this to `blocked` + human escalation with the
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.225.0",
3
+ "version": "2.225.1",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"