@codyswann/lisa 2.211.3 → 2.212.0

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 (69) 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-implement/SKILL.md +16 -4
  5. package/plugins/lisa/hooks/enforce-verification-gate.sh +1 -1
  6. package/plugins/lisa/rules/eager/tool-access-gate.md +21 -0
  7. package/plugins/lisa/rules/reference/tool-access-gate.md +121 -0
  8. package/plugins/lisa/skills/lisa-implement/SKILL.md +16 -4
  9. package/plugins/lisa-agy/plugin.json +1 -1
  10. package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +16 -4
  11. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  12. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  13. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  14. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  17. package/plugins/lisa-copilot/hooks/enforce-verification-gate.sh +1 -1
  18. package/plugins/lisa-copilot/rules/eager/tool-access-gate.md +21 -0
  19. package/plugins/lisa-copilot/rules/reference/tool-access-gate.md +121 -0
  20. package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +16 -4
  21. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-cursor/hooks/enforce-verification-gate.sh +1 -1
  23. package/plugins/lisa-cursor/rules/tool-access-gate-reference.mdc +126 -0
  24. package/plugins/lisa-cursor/rules/tool-access-gate.mdc +26 -0
  25. package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +16 -4
  26. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  28. package/plugins/lisa-expo-agy/plugin.json +1 -1
  29. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  38. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  48. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  49. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-rails-agy/plugin.json +1 -1
  54. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  59. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  64. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/src/base/hooks/enforce-verification-gate.sh +1 -1
  67. package/plugins/src/base/rules/eager/tool-access-gate.md +21 -0
  68. package/plugins/src/base/rules/reference/tool-access-gate.md +121 -0
  69. package/plugins/src/base/skills/lisa-implement/SKILL.md +16 -4
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.211.3",
3
+ "version": "2.212.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.211.3",
3
+ "version": "2.212.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.211.3",
3
+ "version": "2.212.0",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.211.3",
3
+ "version": "2.212.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.211.3",
3
+ "version": "2.212.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.211.3",
3
+ "version": "2.212.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -32,7 +32,7 @@
32
32
  # "plan": "<plan-name>",
33
33
  # "status": "pass" | "fail" | "blocked" | "in_progress",
34
34
  # "criteria": [
35
- # { "task": "...", "criterion": "...", "status": "pass" | "fail", "evidence": "..." }
35
+ # { "task": "...", "criterion": "...", "status": "pass" | "fail" | "blocked", "evidence": "..." }
36
36
  # ],
37
37
  # "updated_at": "<ISO8601 UTC>"
38
38
  # }
@@ -0,0 +1,21 @@
1
+ # Tool Access Gate (load-bearing)
2
+
3
+ Only take on work you can finish. Before implementation starts — and again the
4
+ moment a new requirement surfaces mid-flow — enumerate every external tool the
5
+ work item needs (implementation, proof command, remote verification: AWS CLI,
6
+ Figma, Jam, Sentry, SonarCloud, PostHog, device/browser harnesses, databases,
7
+ deploy targets, …) and **prove access with a cheap read-only probe**, routing
8
+ through the matching `*-access` skill where one exists. Presence on PATH is not
9
+ access; a probe failure counts only after exhausting documented credential
10
+ sources.
11
+
12
+ If a required tool is inaccessible: **break out — never work around it.** Post
13
+ an "Access Needed" comment on the work item (plain-English summary, the exact
14
+ credential/role/env var to grant, and the probe that must pass), transition it
15
+ to the configured blocked state with the `human_needed` marker, and write a
16
+ `blocked` verification verdict. Substituting weaker verification, mocking the
17
+ inaccessible system, guessing at tool contents, or narrowing scope to dodge the
18
+ gap are all forbidden.
19
+
20
+ Full contract (probe table, comment format, resume path):
21
+ [reference/tool-access-gate.md](../reference/tool-access-gate.md).
@@ -0,0 +1,121 @@
1
+ # Tool Access Gate
2
+
3
+ A flow may only take on work it can actually finish. If completing a work item —
4
+ including its empirical verification — requires an external tool or system the
5
+ agent cannot access, the flow must **break out and report the missing access on
6
+ the work item**, never work around it. This is the flow-side arm of the factory
7
+ contract: intake validates that the factory has "the tooling *and provable
8
+ access to that tooling*"; this gate re-proves that promise at execution time and
9
+ enforces it for tools discovered mid-flow.
10
+
11
+ "Tool" means any external surface the work depends on, for example:
12
+
13
+ - Cloud/provider CLIs and APIs: AWS (CloudWatch logs, S3, …), GCP, Azure
14
+ - Design sources: Figma
15
+ - Bug/session capture: Jam
16
+ - Observability: Sentry, PostHog, CloudWatch
17
+ - Quality gates: SonarCloud
18
+ - Trackers and docs: JIRA/Confluence, Linear, Notion, GitHub
19
+ - Device/browser harnesses: Playwright, Maestro, Detox, simulators/emulators
20
+ - Databases, deploy targets, and protected environments
21
+
22
+ ## When the gate runs
23
+
24
+ 1. **Preflight** — after the completion condition is defined and before any
25
+ implementation task starts, enumerate every tool required by (a) the
26
+ implementation itself, (b) the proof command / verification plan, and
27
+ (c) remote verification and post-deploy checks. Sources for the enumeration:
28
+ the work item (description, comments, attachments — a Figma link or Jam
29
+ capture implies that tool), acceptance criteria, `testing_requirements`,
30
+ the `verification` metadata, and the deploy pipeline for the target
31
+ environment.
32
+ 2. **Continuously** — the moment a previously unknown tool requirement surfaces
33
+ mid-flow (e.g. verification turns out to need CloudWatch log capture), probe
34
+ it right then and record the new tool + probe result in the same places the
35
+ preflight wrote to (the plan/tracker artifact and the affected tasks'
36
+ `metadata.required_access`) before continuing. Discovery timing changes
37
+ nothing about the protocol.
38
+
39
+ ## Proving access
40
+
41
+ Access is proven by a **cheap, read-only probe that actually exercises the
42
+ authenticated surface** — tool presence on PATH is not access.
43
+
44
+ - Vendors with an access layer MUST be probed through their `*-access` skill
45
+ (see the `integration-access-layer` rule): `lisa-atlassian-access`,
46
+ `lisa-notion-access`, `lisa-linear-access`, `lisa-jam-access`,
47
+ `lisa-sonarcloud-access`, `lisa-sentry-access`, `lisa-posthog-access`,
48
+ `lisa-expo:play-store-access`. A loud access-skill failure naming a missing
49
+ env var IS a failed probe.
50
+ - Vendors without an access layer are probed with the cheapest authenticated
51
+ read the runtime offers (an MCP tool call, a CLI read, a REST GET).
52
+
53
+ Example probes:
54
+
55
+ | Tool | Probe |
56
+ |---|---|
57
+ | AWS CLI | `aws sts get-caller-identity`, plus the service-level read the task needs (e.g. `aws logs describe-log-groups --max-items 1`) |
58
+ | GitHub | a repository-scoped read against the target repo (e.g. `gh api repos/<owner>/<repo> --jq .full_name`, or the exact read the work item needs) — `gh auth status` alone only proves host auth, not access to the repository |
59
+ | Figma | a read call against the linked file via the available Figma MCP/API surface |
60
+ | Sentry / Jam / SonarCloud / PostHog / Atlassian / Linear / Notion | the matching `*-access` skill's resolve/auth check |
61
+ | Database | the project's documented read-only connection check |
62
+ | Deploy target | reach the target environment with the credentials the verify step will use |
63
+ | Device/browser harness | the harness's own doctor/smoke entry (e.g. `playwright --version` plus a trivial headless launch) |
64
+
65
+ A probe failure only counts **after exhausting the documented credential
66
+ sources** (the same order the `verification` rule mandates): project e2e
67
+ config/fixtures, `.lisa.config.local.json` and environment variables, then
68
+ documented work-item credentials (e.g. `Sign-in Required`). Missing access you
69
+ could have resolved from those sources is not a blocker — resolve it and
70
+ proceed.
71
+
72
+ Record the enumeration and probe results in the flow's plan/tracker artifact
73
+ (and task `metadata.required_access` where the flow's task contract carries
74
+ it), so the verifier can confirm the gate ran.
75
+
76
+ ## On failure: break out, never work around
77
+
78
+ When a required tool fails its probe:
79
+
80
+ 1. **Stop the affected work immediately.** Do not start (or continue)
81
+ implementation whose completion condition cannot be proven.
82
+ 2. **Update the work item with an "Access Needed" comment** containing, for
83
+ each missing tool:
84
+ - a one-sentence plain-English summary a non-technical operator can act on
85
+ ("Lisa needs read access to the app's AWS logs to prove this fix works");
86
+ - the tool and the operation it is needed for (which acceptance criterion /
87
+ verification step);
88
+ - the exact access to grant: env var name, credential/role/permission, or
89
+ account invitation required;
90
+ - the probe command that must pass once access is granted.
91
+ 3. **Transition the work item to the configured blocked state** and apply the
92
+ configured `human_needed` / needs-human marker — missing access is a
93
+ **human-only blocker** (someone must provision credentials or grant access);
94
+ do not fabricate a build-ready ticket for it.
95
+ 4. **Release the verification gate honestly**: write the verdict with
96
+ `status: "blocked"`, and mark each acceptance criterion whose proof depends
97
+ on the missing tool as `status: "blocked"` with the missing-access
98
+ diagnosis as its `evidence`; unaffected criteria keep their real
99
+ `pass`/`fail` result.
100
+ 5. **Resume only when the probe passes.** When access is granted, re-run the
101
+ recorded probe before continuing; `repair-intake` re-validates blocked items
102
+ whose blockers cleared.
103
+
104
+ ### Forbidden workarounds
105
+
106
+ None of the following ever substitutes for missing access:
107
+
108
+ - Swapping the verification for a weaker one the agent *can* run (unit tests or
109
+ code reading instead of the required log capture / UI observation).
110
+ - Mocking, stubbing, or simulating the inaccessible system to make the proof
111
+ "pass".
112
+ - Marking work done on artifact-only evidence, or asserting success without the
113
+ runtime evidence the completion condition demands.
114
+ - Guessing at the tool's contents (e.g. implementing a design without reading
115
+ the linked Figma file, or "fixing" a bug without the Jam/Sentry evidence the
116
+ ticket points at).
117
+ - Silently narrowing scope so the inaccessible part is "out of scope".
118
+
119
+ If a *partial* set of tasks is unaffected by the missing access, those tasks may
120
+ complete, but the work item as a whole must not be marked terminal-done while
121
+ any acceptance criterion's proof is blocked on access.
@@ -138,9 +138,18 @@ This condition is the contract the Verify flow proves and records in the verific
138
138
  1. Direct deploy the changes to dev and then Write a simple API client and call the offending API
139
139
  2. Start the server on localhost and then Use the Playwright CLI or Chrome DevTools
140
140
 
141
+ Using the general-purpose agent in Team Lead session, run the **tool access preflight** per the `tool-access-gate` rule (loaded via the lisa plugin) before any implementation task is created or started:
142
+
143
+ 1. Enumerate every external tool or system this flow will need — for the implementation itself, for the proof command, and for remote verification (AWS CLI/CloudWatch, Figma, Jam, Sentry, SonarCloud, PostHog, device/browser harnesses, databases, deploy targets, trackers, …). Derive the list from the resolved work item (a linked Figma file, Jam capture, or Sentry issue implies that tool), the acceptance criteria, the testing requirements, and the completion condition above.
144
+ 2. Prove access to each with its cheapest read-only probe, routing through the matching `*-access` skill where one exists (`integration-access-layer` rule). Tool presence on PATH is not access; a probe failure counts only after exhausting the documented credential sources (project e2e config/fixtures, `.lisa.config.local.json` / env vars, documented work-item credentials).
145
+ 3. Record the enumeration and probe results in the plan artifact and in each task's `metadata.required_access`.
146
+ 4. If any required tool fails its probe, do NOT start implementation — follow the break-out protocol in the `tool-access-gate` rule: post an "Access Needed" comment on the work item (plain-English summary, the exact credential/role/env var to grant, the probe that must pass), transition the item to the configured blocked state with the `human_needed` marker, write the verification verdict with `status: "blocked"`, and stop. Working around missing access — substituting weaker verification, mocking the inaccessible system, guessing at tool contents, or narrowing scope — is never permitted, for any tool.
147
+
148
+ The same gate applies **continuously**: if a tool requirement surfaces mid-flow (e.g. verification turns out to need CloudWatch log capture the runtime cannot authenticate to), probe it the moment it is discovered, record the new tool and probe result in the plan artifact and the affected tasks' `metadata.required_access` before continuing, and break out identically on failure.
149
+
141
150
  Using the general-purpose agent in Team Lead session, create tasks needed to complete the request.
142
151
 
143
- Every task MUST include this JSON metadata block. Do NOT omit `skills` (use `[]` if none), `learnings` (use `[]` if none) or `verification`.
152
+ Every task MUST include this JSON metadata block. Do NOT omit `skills` (use `[]` if none), `learnings` (use `[]` if none), `required_access` (use `[]` if the task needs no external tool) or `verification`.
144
153
 
145
154
  ```json
146
155
  {
@@ -151,6 +160,9 @@ Every task MUST include this JSON metadata block. Do NOT omit `skills` (use `[]`
151
160
  "testing_requirements": ["..."],
152
161
  "skills": ["..."],
153
162
  "learnings": ["..."],
163
+ "required_access": [
164
+ { "tool": "<external tool/system this task or its verification needs>", "probe": "<the read-only command or *-access check that proves access>", "status": "pass|fail" }
165
+ ],
154
166
  "verification": {
155
167
  "type": "ui-recording|api-test|cli-test|database-check|manual-check|documentation",
156
168
  "command": "the proof command — must run the actual system and surface its result in the transcript (NOT test/typecheck/lint, those are quality gates). Phrase it so an independent verifier sees the evidence, e.g. `curl -s localhost:3000/health` not `check that health works`",
@@ -177,7 +189,7 @@ Before shutting down the team, execute the Verify flow:
177
189
  "plan": "<plan-name>",
178
190
  "status": "pass | fail | blocked | in_progress",
179
191
  "criteria": [
180
- { "task": "<task id or title>", "criterion": "<the completion condition>", "status": "pass | fail", "evidence": "<the proof command run and the observed result>" }
192
+ { "task": "<task id or title>", "criterion": "<the completion condition>", "status": "pass | fail | blocked", "evidence": "<the proof command run and the observed result; for a blocked criterion, the blocker diagnosis (e.g. the missing access and the probe that must pass)>" }
181
193
  ],
182
194
  "updated_at": "<ISO8601 UTC>"
183
195
  }
@@ -185,10 +197,10 @@ Before shutting down the team, execute the Verify flow:
185
197
 
186
198
  Set `status: "pass"` only when every criterion is `pass` with real evidence (output from running the system, not a claim). The verdict must be judged by an agent that did NOT implement the change (the `verification-specialist`), never self-certified by the implementer. This is runtime scratch — it is gitignored and MUST NOT be committed (treat it like the secrets exclusion in the commit step).
187
199
 
188
- On Claude, the `enforce-verification-gate.sh` Stop hook reads this file and **will not let the flow stop** until it shows a terminal, all-`pass` verdict — carrying over the non-bypassable completion gate of the `/goal` primitive, but checked deterministically against real evidence rather than by a transcript-only evaluator model. If you must stop before completion, write the verdict with `status: "blocked"` and the reason — that records the outcome and releases the gate instead of leaving it to spin. But a `blocked` verdict is a last resort, not a shortcut around fillable work: **first resolve every gap you can resolve yourself.** If the work item is thin — missing its Validation Journey, acceptance criteria, or other derivable detail — enrich it: derive the missing detail from the ticket context and the codebase, write it back, and proceed. Do **not** block on a gap you could have filled. Only a blocker that survives that attempt is real, and it is one of two kinds:
200
+ On Claude, the `enforce-verification-gate.sh` Stop hook reads this file and **will not let the flow stop** until it shows a terminal, all-`pass` verdict — carrying over the non-bypassable completion gate of the `/goal` primitive, but checked deterministically against real evidence rather than by a transcript-only evaluator model. If you must stop before completion, write the verdict with `status: "blocked"` and the reason — marking each criterion whose proof is blocked as `status: "blocked"` with the blocker diagnosis as its `evidence`, while unaffected criteria keep their real `pass`/`fail` result — that records the outcome and releases the gate instead of leaving it to spin. But a `blocked` verdict is a last resort, not a shortcut around fillable work: **first resolve every gap you can resolve yourself.** If the work item is thin — missing its Validation Journey, acceptance criteria, or other derivable detail — enrich it: derive the missing detail from the ticket context and the codebase, write it back, and proceed. Do **not** block on a gap you could have filled. Only a blocker that survives that attempt is real, and it is one of two kinds:
189
201
 
190
202
  - **Actionable blocker** — an unresolved dependency or fixable technical gap that some team or repository could build (a missing or changed schema field, an unbuilt sibling work item, a required upstream fix), **including cross-repo dependencies**. Before writing the blocked verdict you MUST (1) file a build-ready fix/dependency ticket capturing the diagnosis — in the dependency's own repository/tracker when it is cross-repo (e.g. a `[<repo>] …` ticket in the shared project, or the sibling tracker) — and (2) link the current work item to it as `is blocked by`. Only then write the verdict. This is the same discipline as the regression-spec blocker and the remote-verification-fail exits above, and it is what makes the block machine-recoverable: `repair-intake` re-dispatches a blocked item once its linked `is blocked by` dependency closes, but it cannot act on a prose-only comment. Recommending the ticket "as a human follow-up" without filing and linking it is **not** a permitted exit.
191
- - **Human-only blocker** — an input the agent genuinely cannot obtain or produce no matter what it does: credentials or secrets it has no access to, or a product/design decision only a human can make. Record the blocked verdict, mark it `human_needed` (the marker `repair-intake` recognizes, so it won't churn re-dispatching it), and surface or reassign to a human; do **not** fabricate a build-ready ticket, because there is no build-ready work.
203
+ - **Human-only blocker** — an input the agent genuinely cannot obtain or produce no matter what it does: credentials, secrets, or **tool access** it does not have (AWS/CloudWatch, Figma, Jam, Sentry, SonarCloud, a database, a protected deploy target, …), or a product/design decision only a human can make. For missing tool access, follow the `tool-access-gate` rule's break-out protocol: post the "Access Needed" comment naming the exact credential/role/env var to grant and the probe that must pass — never work around the gap by substituting weaker verification, mocking the inaccessible system, or narrowing scope. Record the blocked verdict, mark it `human_needed` (the marker `repair-intake` recognizes, so it won't churn re-dispatching it), and surface or reassign to a human; do **not** fabricate a build-ready ticket, because there is no build-ready work.
192
204
 
193
205
  Other harnesses fall back to this prose obligation.
194
206
  3. Write the highest-practical-observation regression test encoding the verification. For user-visible bugs or user-visible Build changes with an available browser/device/e2e harness, this means a deterministic spec on the reported surface. Prove the new spec actually executed and passed in PR CI by recording a named spec log/reporter line or equivalent execution record; green CI without that named evidence does not satisfy this step.