@codyswann/lisa 2.130.0 → 2.130.3

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 (86) 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/skills/atlassian-access/SKILL.md +3 -1
  5. package/plugins/lisa/skills/repair-intake/SKILL.md +13 -2
  6. package/plugins/lisa-agy/plugin.json +1 -1
  7. package/plugins/lisa-agy/skills/atlassian-access/SKILL.md +3 -1
  8. package/plugins/lisa-agy/skills/repair-intake/SKILL.md +13 -2
  9. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  11. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  12. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-copilot/skills/atlassian-access/SKILL.md +3 -1
  16. package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +13 -2
  17. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  18. package/plugins/lisa-cursor/skills/atlassian-access/SKILL.md +3 -1
  19. package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +13 -2
  20. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-expo/commands/exploratory-qa.md +1 -1
  23. package/plugins/lisa-expo/skills/exploratory-qa/SKILL.md +16 -7
  24. package/plugins/lisa-expo-agy/commands/exploratory-qa.md +1 -1
  25. package/plugins/lisa-expo-agy/plugin.json +1 -1
  26. package/plugins/lisa-expo-agy/skills/exploratory-qa/SKILL.md +16 -7
  27. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo-copilot/commands/exploratory-qa.md +1 -1
  29. package/plugins/lisa-expo-copilot/skills/exploratory-qa/SKILL.md +16 -7
  30. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo-cursor/commands/exploratory-qa.md +1 -1
  32. package/plugins/lisa-expo-cursor/skills/exploratory-qa/SKILL.md +16 -7
  33. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric/commands/exploratory-qa.md +1 -1
  36. package/plugins/lisa-harper-fabric/skills/exploratory-qa/SKILL.md +16 -7
  37. package/plugins/lisa-harper-fabric-agy/commands/exploratory-qa.md +1 -1
  38. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric-agy/skills/exploratory-qa/SKILL.md +16 -7
  40. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric-copilot/commands/exploratory-qa.md +1 -1
  42. package/plugins/lisa-harper-fabric-copilot/skills/exploratory-qa/SKILL.md +16 -7
  43. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-harper-fabric-cursor/commands/exploratory-qa.md +1 -1
  45. package/plugins/lisa-harper-fabric-cursor/skills/exploratory-qa/SKILL.md +16 -7
  46. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  48. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  49. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  54. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails/commands/exploratory-qa.md +1 -1
  59. package/plugins/lisa-rails/skills/exploratory-qa/SKILL.md +16 -7
  60. package/plugins/lisa-rails-agy/commands/exploratory-qa.md +1 -1
  61. package/plugins/lisa-rails-agy/plugin.json +1 -1
  62. package/plugins/lisa-rails-agy/skills/exploratory-qa/SKILL.md +16 -7
  63. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails-copilot/commands/exploratory-qa.md +1 -1
  65. package/plugins/lisa-rails-copilot/skills/exploratory-qa/SKILL.md +16 -7
  66. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-rails-cursor/commands/exploratory-qa.md +1 -1
  68. package/plugins/lisa-rails-cursor/skills/exploratory-qa/SKILL.md +16 -7
  69. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  72. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  77. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/src/base/skills/atlassian-access/SKILL.md +3 -1
  80. package/plugins/src/base/skills/repair-intake/SKILL.md +13 -2
  81. package/plugins/src/expo/commands/exploratory-qa.md +1 -1
  82. package/plugins/src/expo/skills/exploratory-qa/SKILL.md +16 -7
  83. package/plugins/src/harper-fabric/commands/exploratory-qa.md +1 -1
  84. package/plugins/src/harper-fabric/skills/exploratory-qa/SKILL.md +16 -7
  85. package/plugins/src/rails/commands/exploratory-qa.md +1 -1
  86. package/plugins/src/rails/skills/exploratory-qa/SKILL.md +16 -7
package/package.json CHANGED
@@ -83,7 +83,7 @@
83
83
  "lodash": ">=4.18.1"
84
84
  },
85
85
  "name": "@codyswann/lisa",
86
- "version": "2.130.0",
86
+ "version": "2.130.3",
87
87
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
88
88
  "main": "dist/index.js",
89
89
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -268,7 +268,7 @@ Substrate column meanings:
268
268
  | `transition key:<K> to:<S>` | `acli jira workitem transition --key <K> --status "<S>" --yes` | `mcp__plugin_atlassian_atlassian__transitionJiraIssue` | resolve transition id then `POST .../issue/<K>/transitions` |
269
269
  | `transitions key:<K>` | (not exposed) | `mcp__plugin_atlassian_atlassian__getTransitionsForJiraIssue` | `GET https://<SITE>/rest/api/3/issue/<K>/transitions` |
270
270
  | `comment key:<K> body:<B>` | `acli jira workitem comment add --key <K> --body "<B>"` | `mcp__plugin_atlassian_atlassian__addCommentToJiraIssue` | `POST https://<SITE>/rest/api/3/issue/<K>/comment` |
271
- | `link from:<K> to:<K2> type:<T>` | `acli jira workitem link create --inward <K> --outward <K2> --type "<T>"` | `mcp__plugin_atlassian_atlassian__createJiraIssueLink` | `POST https://<SITE>/rest/api/3/issueLink` |
271
+ | `link from:<K> to:<K2> type:<T>` | `acli jira workitem link create --in <K> --out <K2> --type "<T>" --yes` (see direction note) | `mcp__plugin_atlassian_atlassian__createJiraIssueLink` | `POST https://<SITE>/rest/api/3/issueLink` |
272
272
  | `remote-links key:<K>` | (not exposed) | `mcp__plugin_atlassian_atlassian__getJiraIssueRemoteIssueLinks` | `GET https://<SITE>/rest/api/3/issue/<K>/remotelink` |
273
273
  | `search-issues jql:<J>` | `acli jira workitem search --jql "<J>" --json` | `mcp__plugin_atlassian_atlassian__searchJiraIssuesUsingJql` | `POST https://<SITE>/rest/api/3/search/jql` |
274
274
  | `list-projects` | `acli jira project list --paginate --json` | `mcp__plugin_atlassian_atlassian__getVisibleJiraProjects` | `GET https://<SITE>/rest/api/3/project/search` |
@@ -291,6 +291,8 @@ Substrate column meanings:
291
291
 
292
292
  **acli flag note:** acli's `--output` flag does not exist; the correct flag is `--json`. List commands require `--paginate` or `--limit` (no implicit fetch-all). `acli jira workitem view` defaults to a restricted field set (`key,issuetype,summary,status,assignee,description`), so `read-ticket` MUST pass `--fields '*all'` or an explicit equivalent that includes every downstream dependency: parent, subtasks, issue links, components, labels, priority, status, issue type, summary, description, fix versions, affected versions, attachments, comments, estimates, sprint/story-point fields, and project-required custom fields. Never rely on the default view fields; they hide parent/components/labels and corrupt leaf-only, relationship-search, build-ready, and required-custom-field gates. Several documented adapters are nominal — verify against `acli <subcmd> --help` before relying on them. When acli's adapter is broken or missing for a specific op, fall through to MCP (if identity-matched) then curl per the tier ordering.
293
293
 
294
+ **acli link-create direction is invertible — flags and verification:** acli has no `--inward`/`--outward` flags; the real flags are `--in` and `--out` (confirm with `acli jira workitem link create --help`). For a `Blocks` link, **`--in` is the blocker and `--out` is the blocked** issue, i.e. `--in <X> --out <Y> --type Blocks` resolves to "X blocks Y" (Y `is blocked by` X). The lisa op `link from:<K> to:<K2> type:<T>` means "K ⟨T⟩ K2", so the blocker `from` maps to `--in` and the blocked `to` maps to `--out` (as in the adapter above). The acli success banner only echoes the `--in`/`--out` values you passed — it does NOT confirm the resolved semantic direction, so a reversed link reports success and looks fine. **After every `link` write, re-read the affected issues via `read-ticket` (which already requests `--fields '*all'`) and confirm `issuelinks[].type` + `inwardIssue`/`outwardIssue` resolve to the intended `blocks` / `is blocked by` direction.** Skipping this can silently reverse an entire epic's dependency graph — e.g. cutover tickets recorded as *blocking* the prerequisites that should block them.
295
+
294
296
  **JIRA terminal-resolution note:** when a caller marks a transition as terminal per `leaf-only-lifecycle`, the substrate must not treat a Done-named status as sufficient by name alone. After `transition key:<K> to:<S>`, re-read the issue and verify `statusCategory = Done`; if the workflow requires a resolution, verify `resolution` is set. If the transition screen requires a resolution value, pass the configured default resolution when available; otherwise return a setup error so the build-intake skill can report the workflow gap instead of silently leaving an unresolved ticket in a Done-looking status.
295
297
 
296
298
  Operations not in this table are unsupported — add an adapter row before using them. Adapters MUST return a structured response (parse `acli`'s `--json`; jq-process curl's raw JSON).
@@ -559,8 +559,19 @@ is no normalized `is blocked by` field. Read the bundle, then extract blockers p
559
559
 
560
560
  Then classify each blocker:
561
561
 
562
- - **Closed / Done** (its true terminal role) → **cleared**.
563
- - **Open** in any non-terminal role (`ready` / `claimed` / `review` / unknown) → **still
562
+ - **Closed, or shipped to any environment** → **cleared**. A blocker is cleared at **any**
563
+ env-staged `done` role not only the production terminal. The `done` role is configured
564
+ per-env as a `{dev, staging, production}` map (`config-resolution`), so `On Dev`, `On Stg`,
565
+ **and** production `Done` all mean the blocker's code is merged and deployed to ≥1 environment.
566
+ A post-build `review` role (e.g. `Code Review`) is likewise cleared — the change exists and is
567
+ in flight. An `is blocked by` link is a **development** dependency: it is satisfied once the
568
+ blocker's code is in trunk; it must NOT wait for the blocker to reach production. (This matches
569
+ the intake-path dependency-hold gate in `lisa:intake-explain`, which already treats
570
+ `code-review` / `on-dev` / `on-stg` / `done` as cleared — repair-intake must not be stricter.
571
+ In an env-staged workflow where `Done` means "in production", a strict production-terminal
572
+ check strands every dependent forever behind a blocker that is already merged and sitting at
573
+ `On Stg` / `On Dev`.)
574
+ - **Open** in a pre-merge role (`ready` / `claimed` / unknown — code not yet in trunk) → **still
564
575
  blocking**.
565
576
  - **Inaccessible** (deleted, cross-org, permission denied) → **still blocking**, unless the item
566
577
  body or a newer human comment explicitly states the dependency is resolved.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -268,7 +268,7 @@ Substrate column meanings:
268
268
  | `transition key:<K> to:<S>` | `acli jira workitem transition --key <K> --status "<S>" --yes` | `mcp__plugin_atlassian_atlassian__transitionJiraIssue` | resolve transition id then `POST .../issue/<K>/transitions` |
269
269
  | `transitions key:<K>` | (not exposed) | `mcp__plugin_atlassian_atlassian__getTransitionsForJiraIssue` | `GET https://<SITE>/rest/api/3/issue/<K>/transitions` |
270
270
  | `comment key:<K> body:<B>` | `acli jira workitem comment add --key <K> --body "<B>"` | `mcp__plugin_atlassian_atlassian__addCommentToJiraIssue` | `POST https://<SITE>/rest/api/3/issue/<K>/comment` |
271
- | `link from:<K> to:<K2> type:<T>` | `acli jira workitem link create --inward <K> --outward <K2> --type "<T>"` | `mcp__plugin_atlassian_atlassian__createJiraIssueLink` | `POST https://<SITE>/rest/api/3/issueLink` |
271
+ | `link from:<K> to:<K2> type:<T>` | `acli jira workitem link create --in <K> --out <K2> --type "<T>" --yes` (see direction note) | `mcp__plugin_atlassian_atlassian__createJiraIssueLink` | `POST https://<SITE>/rest/api/3/issueLink` |
272
272
  | `remote-links key:<K>` | (not exposed) | `mcp__plugin_atlassian_atlassian__getJiraIssueRemoteIssueLinks` | `GET https://<SITE>/rest/api/3/issue/<K>/remotelink` |
273
273
  | `search-issues jql:<J>` | `acli jira workitem search --jql "<J>" --json` | `mcp__plugin_atlassian_atlassian__searchJiraIssuesUsingJql` | `POST https://<SITE>/rest/api/3/search/jql` |
274
274
  | `list-projects` | `acli jira project list --paginate --json` | `mcp__plugin_atlassian_atlassian__getVisibleJiraProjects` | `GET https://<SITE>/rest/api/3/project/search` |
@@ -291,6 +291,8 @@ Substrate column meanings:
291
291
 
292
292
  **acli flag note:** acli's `--output` flag does not exist; the correct flag is `--json`. List commands require `--paginate` or `--limit` (no implicit fetch-all). `acli jira workitem view` defaults to a restricted field set (`key,issuetype,summary,status,assignee,description`), so `read-ticket` MUST pass `--fields '*all'` or an explicit equivalent that includes every downstream dependency: parent, subtasks, issue links, components, labels, priority, status, issue type, summary, description, fix versions, affected versions, attachments, comments, estimates, sprint/story-point fields, and project-required custom fields. Never rely on the default view fields; they hide parent/components/labels and corrupt leaf-only, relationship-search, build-ready, and required-custom-field gates. Several documented adapters are nominal — verify against `acli <subcmd> --help` before relying on them. When acli's adapter is broken or missing for a specific op, fall through to MCP (if identity-matched) then curl per the tier ordering.
293
293
 
294
+ **acli link-create direction is invertible — flags and verification:** acli has no `--inward`/`--outward` flags; the real flags are `--in` and `--out` (confirm with `acli jira workitem link create --help`). For a `Blocks` link, **`--in` is the blocker and `--out` is the blocked** issue, i.e. `--in <X> --out <Y> --type Blocks` resolves to "X blocks Y" (Y `is blocked by` X). The lisa op `link from:<K> to:<K2> type:<T>` means "K ⟨T⟩ K2", so the blocker `from` maps to `--in` and the blocked `to` maps to `--out` (as in the adapter above). The acli success banner only echoes the `--in`/`--out` values you passed — it does NOT confirm the resolved semantic direction, so a reversed link reports success and looks fine. **After every `link` write, re-read the affected issues via `read-ticket` (which already requests `--fields '*all'`) and confirm `issuelinks[].type` + `inwardIssue`/`outwardIssue` resolve to the intended `blocks` / `is blocked by` direction.** Skipping this can silently reverse an entire epic's dependency graph — e.g. cutover tickets recorded as *blocking* the prerequisites that should block them.
295
+
294
296
  **JIRA terminal-resolution note:** when a caller marks a transition as terminal per `leaf-only-lifecycle`, the substrate must not treat a Done-named status as sufficient by name alone. After `transition key:<K> to:<S>`, re-read the issue and verify `statusCategory = Done`; if the workflow requires a resolution, verify `resolution` is set. If the transition screen requires a resolution value, pass the configured default resolution when available; otherwise return a setup error so the build-intake skill can report the workflow gap instead of silently leaving an unresolved ticket in a Done-looking status.
295
297
 
296
298
  Operations not in this table are unsupported — add an adapter row before using them. Adapters MUST return a structured response (parse `acli`'s `--json`; jq-process curl's raw JSON).
@@ -559,8 +559,19 @@ is no normalized `is blocked by` field. Read the bundle, then extract blockers p
559
559
 
560
560
  Then classify each blocker:
561
561
 
562
- - **Closed / Done** (its true terminal role) → **cleared**.
563
- - **Open** in any non-terminal role (`ready` / `claimed` / `review` / unknown) → **still
562
+ - **Closed, or shipped to any environment** → **cleared**. A blocker is cleared at **any**
563
+ env-staged `done` role not only the production terminal. The `done` role is configured
564
+ per-env as a `{dev, staging, production}` map (`config-resolution`), so `On Dev`, `On Stg`,
565
+ **and** production `Done` all mean the blocker's code is merged and deployed to ≥1 environment.
566
+ A post-build `review` role (e.g. `Code Review`) is likewise cleared — the change exists and is
567
+ in flight. An `is blocked by` link is a **development** dependency: it is satisfied once the
568
+ blocker's code is in trunk; it must NOT wait for the blocker to reach production. (This matches
569
+ the intake-path dependency-hold gate in `lisa:intake-explain`, which already treats
570
+ `code-review` / `on-dev` / `on-stg` / `done` as cleared — repair-intake must not be stricter.
571
+ In an env-staged workflow where `Done` means "in production", a strict production-terminal
572
+ check strands every dependent forever behind a blocker that is already merged and sitting at
573
+ `On Stg` / `On Dev`.)
574
+ - **Open** in a pre-merge role (`ready` / `claimed` / unknown — code not yet in trunk) → **still
564
575
  blocking**.
565
576
  - **Inaccessible** (deleted, cross-org, permission denied) → **still blocking**, unless the item
566
577
  body or a newer human comment explicitly states the dependency is resolved.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
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.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
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.130.0",
3
+ "version": "2.130.3",
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.130.0",
3
+ "version": "2.130.3",
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.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -268,7 +268,7 @@ Substrate column meanings:
268
268
  | `transition key:<K> to:<S>` | `acli jira workitem transition --key <K> --status "<S>" --yes` | `mcp__plugin_atlassian_atlassian__transitionJiraIssue` | resolve transition id then `POST .../issue/<K>/transitions` |
269
269
  | `transitions key:<K>` | (not exposed) | `mcp__plugin_atlassian_atlassian__getTransitionsForJiraIssue` | `GET https://<SITE>/rest/api/3/issue/<K>/transitions` |
270
270
  | `comment key:<K> body:<B>` | `acli jira workitem comment add --key <K> --body "<B>"` | `mcp__plugin_atlassian_atlassian__addCommentToJiraIssue` | `POST https://<SITE>/rest/api/3/issue/<K>/comment` |
271
- | `link from:<K> to:<K2> type:<T>` | `acli jira workitem link create --inward <K> --outward <K2> --type "<T>"` | `mcp__plugin_atlassian_atlassian__createJiraIssueLink` | `POST https://<SITE>/rest/api/3/issueLink` |
271
+ | `link from:<K> to:<K2> type:<T>` | `acli jira workitem link create --in <K> --out <K2> --type "<T>" --yes` (see direction note) | `mcp__plugin_atlassian_atlassian__createJiraIssueLink` | `POST https://<SITE>/rest/api/3/issueLink` |
272
272
  | `remote-links key:<K>` | (not exposed) | `mcp__plugin_atlassian_atlassian__getJiraIssueRemoteIssueLinks` | `GET https://<SITE>/rest/api/3/issue/<K>/remotelink` |
273
273
  | `search-issues jql:<J>` | `acli jira workitem search --jql "<J>" --json` | `mcp__plugin_atlassian_atlassian__searchJiraIssuesUsingJql` | `POST https://<SITE>/rest/api/3/search/jql` |
274
274
  | `list-projects` | `acli jira project list --paginate --json` | `mcp__plugin_atlassian_atlassian__getVisibleJiraProjects` | `GET https://<SITE>/rest/api/3/project/search` |
@@ -291,6 +291,8 @@ Substrate column meanings:
291
291
 
292
292
  **acli flag note:** acli's `--output` flag does not exist; the correct flag is `--json`. List commands require `--paginate` or `--limit` (no implicit fetch-all). `acli jira workitem view` defaults to a restricted field set (`key,issuetype,summary,status,assignee,description`), so `read-ticket` MUST pass `--fields '*all'` or an explicit equivalent that includes every downstream dependency: parent, subtasks, issue links, components, labels, priority, status, issue type, summary, description, fix versions, affected versions, attachments, comments, estimates, sprint/story-point fields, and project-required custom fields. Never rely on the default view fields; they hide parent/components/labels and corrupt leaf-only, relationship-search, build-ready, and required-custom-field gates. Several documented adapters are nominal — verify against `acli <subcmd> --help` before relying on them. When acli's adapter is broken or missing for a specific op, fall through to MCP (if identity-matched) then curl per the tier ordering.
293
293
 
294
+ **acli link-create direction is invertible — flags and verification:** acli has no `--inward`/`--outward` flags; the real flags are `--in` and `--out` (confirm with `acli jira workitem link create --help`). For a `Blocks` link, **`--in` is the blocker and `--out` is the blocked** issue, i.e. `--in <X> --out <Y> --type Blocks` resolves to "X blocks Y" (Y `is blocked by` X). The lisa op `link from:<K> to:<K2> type:<T>` means "K ⟨T⟩ K2", so the blocker `from` maps to `--in` and the blocked `to` maps to `--out` (as in the adapter above). The acli success banner only echoes the `--in`/`--out` values you passed — it does NOT confirm the resolved semantic direction, so a reversed link reports success and looks fine. **After every `link` write, re-read the affected issues via `read-ticket` (which already requests `--fields '*all'`) and confirm `issuelinks[].type` + `inwardIssue`/`outwardIssue` resolve to the intended `blocks` / `is blocked by` direction.** Skipping this can silently reverse an entire epic's dependency graph — e.g. cutover tickets recorded as *blocking* the prerequisites that should block them.
295
+
294
296
  **JIRA terminal-resolution note:** when a caller marks a transition as terminal per `leaf-only-lifecycle`, the substrate must not treat a Done-named status as sufficient by name alone. After `transition key:<K> to:<S>`, re-read the issue and verify `statusCategory = Done`; if the workflow requires a resolution, verify `resolution` is set. If the transition screen requires a resolution value, pass the configured default resolution when available; otherwise return a setup error so the build-intake skill can report the workflow gap instead of silently leaving an unresolved ticket in a Done-looking status.
295
297
 
296
298
  Operations not in this table are unsupported — add an adapter row before using them. Adapters MUST return a structured response (parse `acli`'s `--json`; jq-process curl's raw JSON).
@@ -559,8 +559,19 @@ is no normalized `is blocked by` field. Read the bundle, then extract blockers p
559
559
 
560
560
  Then classify each blocker:
561
561
 
562
- - **Closed / Done** (its true terminal role) → **cleared**.
563
- - **Open** in any non-terminal role (`ready` / `claimed` / `review` / unknown) → **still
562
+ - **Closed, or shipped to any environment** → **cleared**. A blocker is cleared at **any**
563
+ env-staged `done` role not only the production terminal. The `done` role is configured
564
+ per-env as a `{dev, staging, production}` map (`config-resolution`), so `On Dev`, `On Stg`,
565
+ **and** production `Done` all mean the blocker's code is merged and deployed to ≥1 environment.
566
+ A post-build `review` role (e.g. `Code Review`) is likewise cleared — the change exists and is
567
+ in flight. An `is blocked by` link is a **development** dependency: it is satisfied once the
568
+ blocker's code is in trunk; it must NOT wait for the blocker to reach production. (This matches
569
+ the intake-path dependency-hold gate in `lisa:intake-explain`, which already treats
570
+ `code-review` / `on-dev` / `on-stg` / `done` as cleared — repair-intake must not be stricter.
571
+ In an env-staged workflow where `Done` means "in production", a strict production-terminal
572
+ check strands every dependent forever behind a blocker that is already merged and sitting at
573
+ `On Stg` / `On Dev`.)
574
+ - **Open** in a pre-merge role (`ready` / `claimed` / unknown — code not yet in trunk) → **still
564
575
  blocking**.
565
576
  - **Inaccessible** (deleted, cross-org, permission denied) → **still blocking**, unless the item
566
577
  body or a newer human comment explicitly states the dependency is resolved.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -268,7 +268,7 @@ Substrate column meanings:
268
268
  | `transition key:<K> to:<S>` | `acli jira workitem transition --key <K> --status "<S>" --yes` | `mcp__plugin_atlassian_atlassian__transitionJiraIssue` | resolve transition id then `POST .../issue/<K>/transitions` |
269
269
  | `transitions key:<K>` | (not exposed) | `mcp__plugin_atlassian_atlassian__getTransitionsForJiraIssue` | `GET https://<SITE>/rest/api/3/issue/<K>/transitions` |
270
270
  | `comment key:<K> body:<B>` | `acli jira workitem comment add --key <K> --body "<B>"` | `mcp__plugin_atlassian_atlassian__addCommentToJiraIssue` | `POST https://<SITE>/rest/api/3/issue/<K>/comment` |
271
- | `link from:<K> to:<K2> type:<T>` | `acli jira workitem link create --inward <K> --outward <K2> --type "<T>"` | `mcp__plugin_atlassian_atlassian__createJiraIssueLink` | `POST https://<SITE>/rest/api/3/issueLink` |
271
+ | `link from:<K> to:<K2> type:<T>` | `acli jira workitem link create --in <K> --out <K2> --type "<T>" --yes` (see direction note) | `mcp__plugin_atlassian_atlassian__createJiraIssueLink` | `POST https://<SITE>/rest/api/3/issueLink` |
272
272
  | `remote-links key:<K>` | (not exposed) | `mcp__plugin_atlassian_atlassian__getJiraIssueRemoteIssueLinks` | `GET https://<SITE>/rest/api/3/issue/<K>/remotelink` |
273
273
  | `search-issues jql:<J>` | `acli jira workitem search --jql "<J>" --json` | `mcp__plugin_atlassian_atlassian__searchJiraIssuesUsingJql` | `POST https://<SITE>/rest/api/3/search/jql` |
274
274
  | `list-projects` | `acli jira project list --paginate --json` | `mcp__plugin_atlassian_atlassian__getVisibleJiraProjects` | `GET https://<SITE>/rest/api/3/project/search` |
@@ -291,6 +291,8 @@ Substrate column meanings:
291
291
 
292
292
  **acli flag note:** acli's `--output` flag does not exist; the correct flag is `--json`. List commands require `--paginate` or `--limit` (no implicit fetch-all). `acli jira workitem view` defaults to a restricted field set (`key,issuetype,summary,status,assignee,description`), so `read-ticket` MUST pass `--fields '*all'` or an explicit equivalent that includes every downstream dependency: parent, subtasks, issue links, components, labels, priority, status, issue type, summary, description, fix versions, affected versions, attachments, comments, estimates, sprint/story-point fields, and project-required custom fields. Never rely on the default view fields; they hide parent/components/labels and corrupt leaf-only, relationship-search, build-ready, and required-custom-field gates. Several documented adapters are nominal — verify against `acli <subcmd> --help` before relying on them. When acli's adapter is broken or missing for a specific op, fall through to MCP (if identity-matched) then curl per the tier ordering.
293
293
 
294
+ **acli link-create direction is invertible — flags and verification:** acli has no `--inward`/`--outward` flags; the real flags are `--in` and `--out` (confirm with `acli jira workitem link create --help`). For a `Blocks` link, **`--in` is the blocker and `--out` is the blocked** issue, i.e. `--in <X> --out <Y> --type Blocks` resolves to "X blocks Y" (Y `is blocked by` X). The lisa op `link from:<K> to:<K2> type:<T>` means "K ⟨T⟩ K2", so the blocker `from` maps to `--in` and the blocked `to` maps to `--out` (as in the adapter above). The acli success banner only echoes the `--in`/`--out` values you passed — it does NOT confirm the resolved semantic direction, so a reversed link reports success and looks fine. **After every `link` write, re-read the affected issues via `read-ticket` (which already requests `--fields '*all'`) and confirm `issuelinks[].type` + `inwardIssue`/`outwardIssue` resolve to the intended `blocks` / `is blocked by` direction.** Skipping this can silently reverse an entire epic's dependency graph — e.g. cutover tickets recorded as *blocking* the prerequisites that should block them.
295
+
294
296
  **JIRA terminal-resolution note:** when a caller marks a transition as terminal per `leaf-only-lifecycle`, the substrate must not treat a Done-named status as sufficient by name alone. After `transition key:<K> to:<S>`, re-read the issue and verify `statusCategory = Done`; if the workflow requires a resolution, verify `resolution` is set. If the transition screen requires a resolution value, pass the configured default resolution when available; otherwise return a setup error so the build-intake skill can report the workflow gap instead of silently leaving an unresolved ticket in a Done-looking status.
295
297
 
296
298
  Operations not in this table are unsupported — add an adapter row before using them. Adapters MUST return a structured response (parse `acli`'s `--json`; jq-process curl's raw JSON).
@@ -559,8 +559,19 @@ is no normalized `is blocked by` field. Read the bundle, then extract blockers p
559
559
 
560
560
  Then classify each blocker:
561
561
 
562
- - **Closed / Done** (its true terminal role) → **cleared**.
563
- - **Open** in any non-terminal role (`ready` / `claimed` / `review` / unknown) → **still
562
+ - **Closed, or shipped to any environment** → **cleared**. A blocker is cleared at **any**
563
+ env-staged `done` role not only the production terminal. The `done` role is configured
564
+ per-env as a `{dev, staging, production}` map (`config-resolution`), so `On Dev`, `On Stg`,
565
+ **and** production `Done` all mean the blocker's code is merged and deployed to ≥1 environment.
566
+ A post-build `review` role (e.g. `Code Review`) is likewise cleared — the change exists and is
567
+ in flight. An `is blocked by` link is a **development** dependency: it is satisfied once the
568
+ blocker's code is in trunk; it must NOT wait for the blocker to reach production. (This matches
569
+ the intake-path dependency-hold gate in `lisa:intake-explain`, which already treats
570
+ `code-review` / `on-dev` / `on-stg` / `done` as cleared — repair-intake must not be stricter.
571
+ In an env-staged workflow where `Done` means "in production", a strict production-terminal
572
+ check strands every dependent forever behind a blocker that is already merged and sitting at
573
+ `On Stg` / `On Dev`.)
574
+ - **Open** in a pre-merge role (`ready` / `claimed` / unknown — code not yet in trunk) → **still
564
575
  blocking**.
565
576
  - **Inaccessible** (deleted, cross-org, permission denied) → **still blocking**, unless the item
566
577
  body or a newer human comment explicitly states the dependency is resolved.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
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.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user, clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated Playwright suite, use e2e-coverage-gaps instead."
2
+ description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user, clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated Playwright suite, use e2e-coverage-gaps instead."
3
3
  allowed-tools: ["Skill"]
4
4
  argument-hint: "[target-url | env] [ready=true|false]"
5
5
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: exploratory-qa
3
- description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — landing cold on the home page and clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances) across all breakpoints. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated Playwright test suite, use the e2e-coverage-gaps skill instead.
3
+ description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — landing cold on the home page and clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances) across all breakpoints. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated Playwright test suite, use the e2e-coverage-gaps skill instead.
4
4
  ---
5
5
 
6
6
  # Exploratory QA
@@ -68,8 +68,12 @@ mistakes, and tries the obvious thing. Cover at least these dimensions unless th
68
68
  - **Consistency / standard UX:** components, spacing, button styles, terminology, and interaction
69
69
  patterns should be consistent across the app and follow common conventions. Flag anything
70
70
  non-standard or that differs screen-to-screen.
71
- - **Load & responsiveness:** long or unclear load times, blank screens, spinners / `Loading...` /
72
- `Connecting...` with no progress, anything that feels slow or janky.
71
+ - **Load & responsiveness:** long or unclear load times, blank screens, skeleton-only shells, spinners
72
+ / `Loading...` / `Connecting...` with no progress, anything that feels slow or janky. Flag pages
73
+ where the browser reports `loaded` / `complete` but meaningful content arrives much later, or where
74
+ the visible shell appears quickly while the real task content remains missing. Capture user-perceived
75
+ timings: shell visible, first meaningful content, and stable/complete content. If the delay is
76
+ noticeable, file a usability/performance ticket even if the eventual content is correct.
73
77
  - **Scroll behavior:** unexpected scroll position, scroll jumps, nested or locked scroll, sticky
74
78
  elements that cover content, content that cannot be reached.
75
79
  - **Behavior correctness:** does the obvious action do what a user expects? Confusing errors, silent
@@ -86,10 +90,15 @@ mistakes, and tries the obvious thing. Cover at least these dimensions unless th
86
90
 
87
91
  ### 5. Watch Load & Latency
88
92
 
89
- - Notice time to first meaningful content and time spent in blank/loading/spinner/connecting states.
90
- - A page can be technically interactive but still visually incomplete note that.
91
- - Treat long waits without clear progress, error, retry, or cancellation as findings. Use practical
92
- labels (noticeable, slow, unacceptable) and include observed durations when available.
93
+ - Measure separate milestones: visible app shell, `document.readyState`, first meaningful
94
+ route-specific content, and visually stable/full route content.
95
+ - Do not treat a visible shell, completed document, or technically clickable page as loaded if the
96
+ route is still blank, skeleton-only, placeholder-only, or waiting for primary data.
97
+ - Treat skeleton-only/placeholder-only screens as loading states. If they persist for a noticeable
98
+ delay, they need clear progress/loading messaging that explains what is happening.
99
+ - Treat long waits to meaningful content or stable/full content without clear progress, error, retry,
100
+ or cancellation as findings. Use practical labels (noticeable, slow, unacceptable) and include
101
+ observed durations when available.
93
102
 
94
103
  ## Mutation Discipline
95
104
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user, clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated Playwright suite, use e2e-coverage-gaps instead."
2
+ description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user, clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated Playwright suite, use e2e-coverage-gaps instead."
3
3
  allowed-tools: ["Skill"]
4
4
  argument-hint: "[target-url | env] [ready=true|false]"
5
5
  ---
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
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: exploratory-qa
3
- description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — landing cold on the home page and clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances) across all breakpoints. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated Playwright test suite, use the e2e-coverage-gaps skill instead.
3
+ description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — landing cold on the home page and clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances) across all breakpoints. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated Playwright test suite, use the e2e-coverage-gaps skill instead.
4
4
  ---
5
5
 
6
6
  # Exploratory QA
@@ -68,8 +68,12 @@ mistakes, and tries the obvious thing. Cover at least these dimensions unless th
68
68
  - **Consistency / standard UX:** components, spacing, button styles, terminology, and interaction
69
69
  patterns should be consistent across the app and follow common conventions. Flag anything
70
70
  non-standard or that differs screen-to-screen.
71
- - **Load & responsiveness:** long or unclear load times, blank screens, spinners / `Loading...` /
72
- `Connecting...` with no progress, anything that feels slow or janky.
71
+ - **Load & responsiveness:** long or unclear load times, blank screens, skeleton-only shells, spinners
72
+ / `Loading...` / `Connecting...` with no progress, anything that feels slow or janky. Flag pages
73
+ where the browser reports `loaded` / `complete` but meaningful content arrives much later, or where
74
+ the visible shell appears quickly while the real task content remains missing. Capture user-perceived
75
+ timings: shell visible, first meaningful content, and stable/complete content. If the delay is
76
+ noticeable, file a usability/performance ticket even if the eventual content is correct.
73
77
  - **Scroll behavior:** unexpected scroll position, scroll jumps, nested or locked scroll, sticky
74
78
  elements that cover content, content that cannot be reached.
75
79
  - **Behavior correctness:** does the obvious action do what a user expects? Confusing errors, silent
@@ -86,10 +90,15 @@ mistakes, and tries the obvious thing. Cover at least these dimensions unless th
86
90
 
87
91
  ### 5. Watch Load & Latency
88
92
 
89
- - Notice time to first meaningful content and time spent in blank/loading/spinner/connecting states.
90
- - A page can be technically interactive but still visually incomplete note that.
91
- - Treat long waits without clear progress, error, retry, or cancellation as findings. Use practical
92
- labels (noticeable, slow, unacceptable) and include observed durations when available.
93
+ - Measure separate milestones: visible app shell, `document.readyState`, first meaningful
94
+ route-specific content, and visually stable/full route content.
95
+ - Do not treat a visible shell, completed document, or technically clickable page as loaded if the
96
+ route is still blank, skeleton-only, placeholder-only, or waiting for primary data.
97
+ - Treat skeleton-only/placeholder-only screens as loading states. If they persist for a noticeable
98
+ delay, they need clear progress/loading messaging that explains what is happening.
99
+ - Treat long waits to meaningful content or stable/full content without clear progress, error, retry,
100
+ or cancellation as findings. Use practical labels (noticeable, slow, unacceptable) and include
101
+ observed durations when available.
93
102
 
94
103
  ## Mutation Discipline
95
104
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user, clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated Playwright suite, use e2e-coverage-gaps instead."
2
+ description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user, clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated Playwright suite, use e2e-coverage-gaps instead."
3
3
  allowed-tools: ["Skill"]
4
4
  argument-hint: "[target-url | env] [ready=true|false]"
5
5
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: exploratory-qa
3
- description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — landing cold on the home page and clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances) across all breakpoints. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated Playwright test suite, use the e2e-coverage-gaps skill instead.
3
+ description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — landing cold on the home page and clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances) across all breakpoints. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated Playwright test suite, use the e2e-coverage-gaps skill instead.
4
4
  ---
5
5
 
6
6
  # Exploratory QA
@@ -68,8 +68,12 @@ mistakes, and tries the obvious thing. Cover at least these dimensions unless th
68
68
  - **Consistency / standard UX:** components, spacing, button styles, terminology, and interaction
69
69
  patterns should be consistent across the app and follow common conventions. Flag anything
70
70
  non-standard or that differs screen-to-screen.
71
- - **Load & responsiveness:** long or unclear load times, blank screens, spinners / `Loading...` /
72
- `Connecting...` with no progress, anything that feels slow or janky.
71
+ - **Load & responsiveness:** long or unclear load times, blank screens, skeleton-only shells, spinners
72
+ / `Loading...` / `Connecting...` with no progress, anything that feels slow or janky. Flag pages
73
+ where the browser reports `loaded` / `complete` but meaningful content arrives much later, or where
74
+ the visible shell appears quickly while the real task content remains missing. Capture user-perceived
75
+ timings: shell visible, first meaningful content, and stable/complete content. If the delay is
76
+ noticeable, file a usability/performance ticket even if the eventual content is correct.
73
77
  - **Scroll behavior:** unexpected scroll position, scroll jumps, nested or locked scroll, sticky
74
78
  elements that cover content, content that cannot be reached.
75
79
  - **Behavior correctness:** does the obvious action do what a user expects? Confusing errors, silent
@@ -86,10 +90,15 @@ mistakes, and tries the obvious thing. Cover at least these dimensions unless th
86
90
 
87
91
  ### 5. Watch Load & Latency
88
92
 
89
- - Notice time to first meaningful content and time spent in blank/loading/spinner/connecting states.
90
- - A page can be technically interactive but still visually incomplete note that.
91
- - Treat long waits without clear progress, error, retry, or cancellation as findings. Use practical
92
- labels (noticeable, slow, unacceptable) and include observed durations when available.
93
+ - Measure separate milestones: visible app shell, `document.readyState`, first meaningful
94
+ route-specific content, and visually stable/full route content.
95
+ - Do not treat a visible shell, completed document, or technically clickable page as loaded if the
96
+ route is still blank, skeleton-only, placeholder-only, or waiting for primary data.
97
+ - Treat skeleton-only/placeholder-only screens as loading states. If they persist for a noticeable
98
+ delay, they need clear progress/loading messaging that explains what is happening.
99
+ - Treat long waits to meaningful content or stable/full content without clear progress, error, retry,
100
+ or cancellation as findings. Use practical labels (noticeable, slow, unacceptable) and include
101
+ observed durations when available.
93
102
 
94
103
  ## Mutation Discipline
95
104
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user, clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated Playwright suite, use e2e-coverage-gaps instead."
2
+ description: "Run a first-time-user exploratory QA walkthrough: experience the app like a brand-new human user, clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent UX, awkward scroll behavior) across all breakpoints, and file each finding (bug or usability issue) as a tracked work item via lisa:tracker-write. The optional ready flag marks tickets build-ready (auto-picked-up by lisa:intake) or leaves them in the backlog for human triage (default). For gaps in the automated Playwright suite, use e2e-coverage-gaps instead."
3
3
  allowed-tools: ["Skill"]
4
4
  argument-hint: "[target-url | env] [ready=true|false]"
5
5
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: exploratory-qa
3
- description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — landing cold on the home page and clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances) across all breakpoints. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated Playwright test suite, use the e2e-coverage-gaps skill instead.
3
+ description: First-time-user exploratory QA walkthrough for web apps that FEEDS THE LIFECYCLE. Use when asked to experience an app the way a brand-new human user would — landing cold on the home page and clicking through to find anything confusing, broken, or hard to understand (human-facing jargon, contextless extracted data, machine-style labels, slow or unclear loads, late meaningful content, cramped or cut-off UI, inconsistent/non-standard UX, awkward scroll behavior, unclear affordances) across all breakpoints. Instead of writing a report file, it files every finding as a tracked work item via lisa:tracker-write (bugs and usability/UX issues). A `ready` parameter controls whether those tickets are created build-ready (auto-picked-up by lisa:intake) or left in the backlog for human triage (default). For gaps in the automated Playwright test suite, use the e2e-coverage-gaps skill instead.
4
4
  ---
5
5
 
6
6
  # Exploratory QA
@@ -68,8 +68,12 @@ mistakes, and tries the obvious thing. Cover at least these dimensions unless th
68
68
  - **Consistency / standard UX:** components, spacing, button styles, terminology, and interaction
69
69
  patterns should be consistent across the app and follow common conventions. Flag anything
70
70
  non-standard or that differs screen-to-screen.
71
- - **Load & responsiveness:** long or unclear load times, blank screens, spinners / `Loading...` /
72
- `Connecting...` with no progress, anything that feels slow or janky.
71
+ - **Load & responsiveness:** long or unclear load times, blank screens, skeleton-only shells, spinners
72
+ / `Loading...` / `Connecting...` with no progress, anything that feels slow or janky. Flag pages
73
+ where the browser reports `loaded` / `complete` but meaningful content arrives much later, or where
74
+ the visible shell appears quickly while the real task content remains missing. Capture user-perceived
75
+ timings: shell visible, first meaningful content, and stable/complete content. If the delay is
76
+ noticeable, file a usability/performance ticket even if the eventual content is correct.
73
77
  - **Scroll behavior:** unexpected scroll position, scroll jumps, nested or locked scroll, sticky
74
78
  elements that cover content, content that cannot be reached.
75
79
  - **Behavior correctness:** does the obvious action do what a user expects? Confusing errors, silent
@@ -86,10 +90,15 @@ mistakes, and tries the obvious thing. Cover at least these dimensions unless th
86
90
 
87
91
  ### 5. Watch Load & Latency
88
92
 
89
- - Notice time to first meaningful content and time spent in blank/loading/spinner/connecting states.
90
- - A page can be technically interactive but still visually incomplete note that.
91
- - Treat long waits without clear progress, error, retry, or cancellation as findings. Use practical
92
- labels (noticeable, slow, unacceptable) and include observed durations when available.
93
+ - Measure separate milestones: visible app shell, `document.readyState`, first meaningful
94
+ route-specific content, and visually stable/full route content.
95
+ - Do not treat a visible shell, completed document, or technically clickable page as loaded if the
96
+ route is still blank, skeleton-only, placeholder-only, or waiting for primary data.
97
+ - Treat skeleton-only/placeholder-only screens as loading states. If they persist for a noticeable
98
+ delay, they need clear progress/loading messaging that explains what is happening.
99
+ - Treat long waits to meaningful content or stable/full content without clear progress, error, retry,
100
+ or cancellation as findings. Use practical labels (noticeable, slow, unacceptable) and include
101
+ observed durations when available.
93
102
 
94
103
  ## Mutation Discipline
95
104
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.130.0",
3
+ "version": "2.130.3",
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.130.0",
3
+ "version": "2.130.3",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"