@haposoft/cafekit 0.18.0 → 0.18.2

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 (162) hide show
  1. package/README.md +12 -1
  2. package/bin/__tests__/claude-settings.test.js +123 -0
  3. package/bin/__tests__/codex-ask-guard.test.js +123 -0
  4. package/bin/__tests__/codex-ask-projection.test.js +51 -0
  5. package/bin/__tests__/codex-hooks-ownership.test.js +80 -1
  6. package/bin/__tests__/codex-hooks.test.js +938 -237
  7. package/bin/__tests__/codex-native-hook-boundaries.test.js +136 -0
  8. package/bin/__tests__/codex-native.test.js +222 -149
  9. package/bin/__tests__/codex-projection-parity.test.js +314 -0
  10. package/bin/__tests__/codex-quiet-hooks.test.js +170 -0
  11. package/bin/__tests__/codex-research-projection.test.js +70 -0
  12. package/bin/__tests__/codex-specs-projection.test.js +76 -0
  13. package/bin/__tests__/develop-contract.test.js +102 -1362
  14. package/bin/__tests__/docs-sync-on-demand.test.js +25 -20
  15. package/bin/__tests__/inspect-paths.test.js +183 -0
  16. package/bin/__tests__/installer-safety.test.js +335 -0
  17. package/bin/__tests__/legacy-authority-decoupled.test.js +14 -19
  18. package/bin/__tests__/legacy-hooks-retired.test.js +18 -8
  19. package/bin/__tests__/omp-bridge.test.js +66 -12
  20. package/bin/__tests__/omp-hooks.test.js +11 -5
  21. package/bin/__tests__/orca-session.test.js +7 -0
  22. package/bin/__tests__/package-inventory.test.js +1 -395
  23. package/bin/__tests__/privacy-paths.test.js +317 -0
  24. package/bin/__tests__/spec-narrowing.test.js +30 -134
  25. package/bin/__tests__/specs-v2-execution-closeout.test.js +0 -372
  26. package/bin/__tests__/test-runtime-dependency-closure.cjs +1 -2
  27. package/bin/__tests__/usage-hook-retired.test.js +5 -3
  28. package/bin/__tests__/validator-grounding.test.js +17 -2929
  29. package/bin/install.js +25 -0
  30. package/bin/lib/codex-install.js +134 -12
  31. package/bin/lib/context.js +1 -1
  32. package/bin/lib/managed-writer.js +2 -3
  33. package/bin/phases/claude-runtime.js +91 -25
  34. package/bin/phases/claude-settings.js +22 -1
  35. package/bin/phases/codex-hooks.js +96 -33
  36. package/bin/phases/codex-runtime.js +45 -49
  37. package/bin/phases/copy-payload.js +11 -28
  38. package/bin/phases/omp-runtime.js +6 -3
  39. package/package.json +2 -3
  40. package/src/claude/CLAUDE.md +4 -0
  41. package/src/claude/agents/code-auditor.md +9 -6
  42. package/src/claude/agents/debugger.md +3 -9
  43. package/src/claude/agents/docs-keeper.md +4 -7
  44. package/src/claude/agents/git-ops.md +2 -4
  45. package/src/claude/agents/implementer.md +6 -7
  46. package/src/claude/agents/inspector.md +2 -0
  47. package/src/claude/agents/project-manager.md +2 -2
  48. package/src/claude/agents/spec-maker.md +4 -4
  49. package/src/claude/agents/test-runner.md +8 -11
  50. package/src/claude/agents/ui-ux-designer.md +0 -1
  51. package/src/claude/gitignore +3 -0
  52. package/src/claude/hooks/__tests__/installed-root.test.js +111 -0
  53. package/src/claude/hooks/__tests__/precompact.test.js +206 -10
  54. package/src/claude/hooks/__tests__/privacy-block.test.js +27 -0
  55. package/src/claude/hooks/__tests__/session-writeenv.test.js +25 -0
  56. package/src/claude/hooks/__tests__/spec-gate.test.js +311 -340
  57. package/src/claude/hooks/__tests__/spec-state-touched.test.js +230 -8
  58. package/src/claude/hooks/__tests__/state.test.js +207 -7
  59. package/src/claude/hooks/__tests__/update-check.test.js +88 -0
  60. package/src/claude/hooks/agent.cjs +7 -6
  61. package/src/claude/hooks/inspect-block.cjs +15 -63
  62. package/src/claude/hooks/lib/inspect-paths.cjs +304 -0
  63. package/src/claude/hooks/lib/parser.cjs +1 -1
  64. package/src/claude/hooks/lib/privacy-command-analysis.cjs +191 -17
  65. package/src/claude/hooks/lib/privacy-paths.cjs +313 -0
  66. package/src/claude/hooks/lib/project-root.cjs +15 -0
  67. package/src/claude/hooks/lib/rules-reservation.cjs +36 -0
  68. package/src/claude/hooks/lib/spec-touch.cjs +67 -0
  69. package/src/claude/hooks/lib/update-check.cjs +77 -0
  70. package/src/claude/hooks/precompact.cjs +8 -15
  71. package/src/claude/hooks/privacy-block.cjs +23 -205
  72. package/src/claude/hooks/rules.cjs +6 -28
  73. package/src/claude/hooks/session.cjs +34 -117
  74. package/src/claude/hooks/spec-gate.cjs +17 -89
  75. package/src/claude/hooks/spec-state.cjs +89 -96
  76. package/src/claude/hooks/state.cjs +96 -51
  77. package/src/claude/migration-manifest.json +20 -8
  78. package/src/claude/output-styles/coding-level-0-eli5.md +9 -9
  79. package/src/claude/output-styles/coding-level-1-junior.md +3 -3
  80. package/src/claude/output-styles/coding-level-2-mid.md +3 -3
  81. package/src/claude/output-styles/coding-level-3-senior.md +2 -2
  82. package/src/claude/output-styles/coding-level-4-lead.md +5 -5
  83. package/src/claude/output-styles/coding-level-5-god.md +6 -6
  84. package/src/claude/rules/ai-dev-rules.md +1 -2
  85. package/src/claude/rules/hook-protocols.md +1 -1
  86. package/src/claude/rules/workflow.md +1 -1
  87. package/src/claude/runtime.json +0 -3
  88. package/src/claude/scripts/generate-skill-catalog.cjs +2 -2
  89. package/src/claude/scripts/provenance.cjs +14 -0
  90. package/src/claude/scripts/spec-receipt.cjs +0 -114
  91. package/src/claude/scripts/spec-resolver.cjs +41 -457
  92. package/src/claude/scripts/workflow-policy.cjs +3 -1801
  93. package/src/claude/settings/settings.json +1 -1
  94. package/src/claude/skills/agent-browser/SKILL.md +1 -1
  95. package/src/claude/skills/ai-multimodal/scripts/check_setup.py +8 -68
  96. package/src/claude/skills/ai-multimodal/scripts/gemini_batch_process.py +6 -28
  97. package/src/claude/skills/chrome-devtools/SKILL.md +14 -31
  98. package/src/claude/skills/code-review/SKILL.md +25 -108
  99. package/src/claude/skills/code-review/references/spec-compliance-review.md +4 -7
  100. package/src/claude/skills/develop/SKILL.md +22 -70
  101. package/src/claude/skills/develop/references/subagent-patterns.md +0 -6
  102. package/src/claude/skills/git/SKILL.md +1 -1
  103. package/src/claude/skills/git/references/worktree-blueprint.md +1 -1
  104. package/src/claude/skills/research/SKILL.md +24 -55
  105. package/src/claude/skills/sync/SKILL.md +12 -34
  106. package/src/claude/skills/sync/references/rebind-and-audit.md +2 -2
  107. package/src/claude/skills/test/SKILL.md +39 -123
  108. package/src/claude/skills/test/references/execution-strategy.md +11 -22
  109. package/src/claude/skills/ui-ux/SKILL.md +1 -1
  110. package/src/claude/skills/ui-ux-pro-max/SKILL.md +24 -79
  111. package/src/claude/skills/web-testing/SKILL.md +2 -20
  112. package/src/codex/AGENTS.md +8 -0
  113. package/src/codex/hooks/ask-guard.cjs +54 -0
  114. package/src/codex/hooks/inspect-block.cjs +11 -7
  115. package/src/codex/hooks/lib/inspect-paths.cjs +1 -199
  116. package/src/codex/hooks/lib/privacy-paths.cjs +1 -0
  117. package/src/codex/hooks/lib/privacy-state.cjs +98 -16
  118. package/src/codex/hooks/lib/rules-reservation.cjs +38 -0
  119. package/src/codex/hooks/lib/secret-keywords.cjs +1 -0
  120. package/src/codex/hooks/lib/spec-receipt.cjs +2 -30
  121. package/src/codex/hooks/lib/spec-session-touch.cjs +100 -0
  122. package/src/codex/hooks/lib/spec-touch.cjs +3 -0
  123. package/src/codex/hooks/lib/spec-utils.cjs +6 -45
  124. package/src/codex/hooks/lib/update-check.cjs +1 -0
  125. package/src/codex/hooks/precompact.cjs +39 -0
  126. package/src/codex/hooks/privacy-approval.cjs +28 -17
  127. package/src/codex/hooks/privacy-block.cjs +9 -215
  128. package/src/codex/hooks/rules.cjs +4 -30
  129. package/src/codex/hooks/secret-output-guardrail.cjs +1 -1
  130. package/src/codex/hooks/session.cjs +47 -11
  131. package/src/codex/hooks/spec-gate.cjs +32 -74
  132. package/src/codex/hooks/spec-state.cjs +68 -46
  133. package/src/codex/hooks/state.cjs +25 -4
  134. package/src/codex/hooks.json +39 -7
  135. package/src/codex/rules/hook-protocols.md +13 -6
  136. package/src/common/AGENTS.md +4 -10
  137. package/src/omp/extensions/cafekit-bridge.mjs +12 -4
  138. package/src/omp/hooks/privacy-block.cjs +24 -206
  139. package/bin/__tests__/change-firewall.semantic-firewall.test.js +0 -2133
  140. package/bin/__tests__/finalizer-pass-gate.semantic-firewall.test.js +0 -342
  141. package/bin/__tests__/release-preflight.semantic-firewall.test.js +0 -586
  142. package/bin/__tests__/review-receipt-c2.semantic-firewall.test.js +0 -378
  143. package/bin/__tests__/specs-v2-policy-and-scaffold.test.js +0 -665
  144. package/bin/__tests__/specs-v2-validator-grounder-contract.test.js +0 -1132
  145. package/src/claude/hooks/lib/context.cjs +0 -527
  146. package/src/claude/hooks/lib/detect.cjs +0 -474
  147. package/src/claude/scripts/change-firewall.cjs +0 -1748
  148. package/src/claude/scripts/spec-authoring-digest.cjs +0 -151
  149. package/src/claude/scripts/spec-authoring-validation.cjs +0 -126
  150. package/src/claude/scripts/spec-final-state.cjs +0 -290
  151. package/src/claude/scripts/spec-ground.cjs +0 -650
  152. package/src/claude/scripts/spec-readiness.cjs +0 -425
  153. package/src/claude/scripts/spec-scaffold.cjs +0 -2317
  154. package/src/claude/scripts/spec-semantic-model.cjs +0 -396
  155. package/src/claude/scripts/validate-spec-output.cjs +0 -3914
  156. package/src/claude/skills/code-review/references/verification-gate.md +0 -41
  157. package/src/claude/skills/specs/templates/design.md +0 -82
  158. package/src/claude/skills/specs/templates/requirements-init.md +0 -8
  159. package/src/claude/skills/specs/templates/requirements.md +0 -42
  160. package/src/claude/skills/specs/templates/spec-state.json +0 -56
  161. package/src/claude/skills/specs/templates/task.md +0 -47
  162. package/src/codex/rules/state-sync.md +0 -60
@@ -63,7 +63,7 @@
63
63
  ],
64
64
  "PreToolUse": [
65
65
  {
66
- "matcher": "Read|Write|Edit|MultiEdit|Bash|Glob|Grep",
66
+ "matcher": "Read|Write|Edit|MultiEdit|NotebookEdit|Bash|Glob|Grep|mcp__.*",
67
67
  "hooks": [
68
68
  {
69
69
  "type": "command",
@@ -236,7 +236,7 @@ agent-browser snapshot -i
236
236
  agent-browser fill @e1 "user@example.com"
237
237
  agent-browser fill @e2 "password123"
238
238
  agent-browser click @e3 # Submit button
239
- agent-browser wait url "/dashboard"
239
+ agent-browser wait --url "/dashboard"
240
240
  ```
241
241
 
242
242
  ### State Persistence (Auth)
@@ -5,7 +5,6 @@ Validate ai-multimodal skill setup and configuration.
5
5
  Checks:
6
6
  - API key presence and format
7
7
  - Python dependencies
8
- - Centralized resolver availability
9
8
  - Directory structure
10
9
  """
11
10
 
@@ -85,69 +84,16 @@ def check_dependencies():
85
84
  return True
86
85
 
87
86
 
88
- def check_centralized_resolver():
89
- """Check if centralized resolver is available."""
90
- print_header("Checking Centralized Resolver")
91
-
92
- claude_root = Path(__file__).parent.parent.parent.parent
93
- resolver_path = claude_root / 'scripts' / 'resolve_env.py'
94
-
95
- if resolver_path.exists():
96
- print_success(f"Centralized resolver found: {resolver_path}")
97
-
98
- # Try to import it
99
- sys.path.insert(0, str(resolver_path.parent))
100
- try:
101
- from resolve_env import resolve_env
102
- print_success("Centralized resolver can be imported")
103
- return True
104
- except ImportError as e:
105
- print_error(f"Centralized resolver exists but cannot be imported: {e}")
106
- return False
107
- else:
108
- print_warning(f"Centralized resolver not found: {resolver_path}")
109
- print_info("Skill will use fallback resolution logic")
110
- return True # Not critical, fallback works
111
-
112
-
113
87
  def find_api_key():
114
- """Find and validate API key using centralized resolver."""
88
+ """Find the API key in the runtime environment."""
115
89
  print_header("Checking API Key Configuration")
116
-
117
- # Try to use centralized resolver
118
- claude_root = Path(__file__).parent.parent.parent.parent
119
- sys.path.insert(0, str(claude_root / 'scripts'))
120
- try:
121
- from resolve_env import resolve_env
122
-
123
- print_info("Using centralized resolver...")
124
- api_key = resolve_env('GEMINI_API_KEY', skill='ai-multimodal')
125
-
126
- if api_key:
127
- print_success("API key found via centralized resolver")
128
- print_info(f"Key preview: {api_key[:20]}...{api_key[-4:]}")
129
-
130
- # Show hierarchy
131
- print_info("\nTo see where the key was found, run:")
132
- print_info("python ~/packages/spec/src/claude/scripts/resolve_env.py GEMINI_API_KEY --skill ai-multimodal --verbose")
133
-
134
- return api_key
135
- else:
136
- print_error("API key not found in any location")
137
- return None
138
-
139
- except ImportError:
140
- print_warning("Centralized resolver not available, using fallback")
141
-
142
- # Fallback: check environment
143
- api_key = os.getenv('GEMINI_API_KEY')
144
- if api_key:
145
- print_success("API key found in process.env")
146
- print_info(f"Key preview: {api_key[:20]}...{api_key[-4:]}")
147
- return api_key
148
- else:
149
- print_error("API key not found")
150
- return None
90
+ api_key = os.getenv('GEMINI_API_KEY')
91
+ if api_key:
92
+ print_success("API key found in process.env")
93
+ print_info(f"Key preview: {api_key[:20]}...{api_key[-4:]}")
94
+ return api_key
95
+ print_error("API key not found")
96
+ return None
151
97
 
152
98
 
153
99
  def validate_api_key_format(api_key):
@@ -250,9 +196,6 @@ def provide_setup_instructions():
250
196
  print("\n3. Verify setup:")
251
197
  print(f" $ python {Path(__file__)}")
252
198
 
253
- print("\n4. Debug if needed:")
254
- print(f" $ python ~/packages/spec/src/claude/scripts/resolve_env.py --show-hierarchy --skill ai-multimodal")
255
- print(f" $ python ~/packages/spec/src/claude/scripts/resolve_env.py GEMINI_API_KEY --skill ai-multimodal --verbose")
256
199
 
257
200
 
258
201
  def main():
@@ -265,9 +208,6 @@ def main():
265
208
  if not check_directory_structure():
266
209
  all_passed = False
267
210
 
268
- # Check centralized resolver
269
- check_centralized_resolver()
270
-
271
211
  # Check dependencies
272
212
  if not check_dependencies():
273
213
  all_passed = False
@@ -23,19 +23,10 @@ from typing import List, Dict, Any, Optional
23
23
  import csv
24
24
  import shutil
25
25
 
26
- # Import centralized environment resolver (works for both local and global installs)
27
- CLAUDE_ROOT = Path(__file__).parent.parent.parent.parent
28
- sys.path.insert(0, str(CLAUDE_ROOT / 'scripts'))
29
26
  try:
30
- from resolve_env import resolve_env
31
- CENTRALIZED_RESOLVER_AVAILABLE = True
27
+ from dotenv import load_dotenv
32
28
  except ImportError:
33
- # Fallback if centralized resolver not available
34
- CENTRALIZED_RESOLVER_AVAILABLE = False
35
- try:
36
- from dotenv import load_dotenv
37
- except ImportError:
38
- load_dotenv = None
29
+ load_dotenv = None
39
30
 
40
31
  # Import key rotation support
41
32
  sys.path.insert(0, str(Path(__file__).parent.parent.parent / 'common'))
@@ -74,10 +65,7 @@ IMAGEN_MODELS = {
74
65
 
75
66
 
76
67
  def find_api_key() -> Optional[str]:
77
- """Find Gemini API key using centralized resolver or fallback.
78
-
79
- Uses ~/packages/spec/src/claude/scripts/resolve_env.py for consistent resolution across all skills.
80
- Falls back to local resolution if centralized resolver not available.
68
+ """Find Gemini API key using local environment resolution.
81
69
 
82
70
  Priority order (highest to lowest):
83
71
  1. process.env (runtime environment variables)
@@ -88,11 +76,6 @@ def find_api_key() -> Optional[str]:
88
76
  6. ~/packages/spec/src/claude/skills/.env (user shared)
89
77
  7. ~/packages/spec/src/claude/.env (user global)
90
78
  """
91
- if CENTRALIZED_RESOLVER_AVAILABLE:
92
- # Use centralized resolver (recommended)
93
- return resolve_env('GEMINI_API_KEY', skill='ai-multimodal')
94
-
95
- # Fallback: Local resolution (legacy)
96
79
  api_key = os.getenv('GEMINI_API_KEY')
97
80
  if api_key:
98
81
  return api_key
@@ -751,18 +734,13 @@ def batch_process(
751
734
  print("Error: GEMINI_API_KEY not found in any location")
752
735
  print("\nSearched locations (highest to lowest priority):")
753
736
  print(" 1. OS environment (process.env)")
754
- if CENTRALIZED_RESOLVER_AVAILABLE:
755
- from resolve_env import get_env_file_paths
756
- for i, (desc, path) in enumerate(get_env_file_paths('ai-multimodal'), 2):
757
- exists = "[OK]" if path.exists() else "[ ]"
758
- print(f" {i}. {exists} {path}")
759
- else:
760
- print(" 2-7. .env files (centralized resolver unavailable)")
737
+ print(" 2. Runtime .env file")
738
+ print(" 3. Shared skills .env file")
739
+ print(" 4. Skill-specific .env file")
761
740
  print("\nQuick fix — add your key to any .env file above:")
762
741
  print(" echo 'GEMINI_API_KEY=your-key' >> ~/packages/spec/src/claude/.env")
763
742
  print("\nOther options:")
764
743
  print(" - Run setup checker: python scripts/check_setup.py")
765
- print(" - Show full hierarchy: python ~/packages/spec/src/claude/scripts/resolve_env.py --show-hierarchy --skill ai-multimodal -v")
766
744
  print("\nFor key rotation, add multiple keys to any .env:")
767
745
  print(" GEMINI_API_KEY=key1")
768
746
  print(" GEMINI_API_KEY_2=key2")
@@ -52,8 +52,7 @@ Browser visibility is resolved automatically by `resolveHeadless()` in `lib/brow
52
52
 
53
53
  Override with `--headless true` or `--headless false` on any script.
54
54
 
55
- - Run multiple scripts/sessions in parallel to simulate real user interactions.
56
- - Run multiple scripts/sessions in parallel to simulate different device types (mobile, tablet, desktop).
55
+ Scripts share one browser and its first tab through `.browser-session.json`, so run them one at a time; parallel runs drive the same page.
57
56
 
58
57
  ## ARIA Snapshot (Element Discovery)
59
58
 
@@ -104,7 +103,6 @@ node "$SKILL_DIR/aria-snapshot.js" --url https://example.com --output ./packages
104
103
 
105
104
  ### Interact by Ref
106
105
 
107
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
108
106
  Use `select-ref.js` to interact with elements by their ref:
109
107
 
110
108
  ```bash
@@ -129,7 +127,6 @@ node "$SKILL_DIR/select-ref.js" --ref e5 --action hover
129
127
 
130
128
  ### Store Snapshots
131
129
 
132
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
133
130
  Store snapshots for analysis in `<project>/packages/spec/src/claude/chrome-devtools/snapshots/`:
134
131
 
135
132
  ```bash
@@ -162,7 +159,6 @@ node "$SKILL_DIR/aria-snapshot.js" --url https://example.com --output packages/s
162
159
 
163
160
  ## Local HTML Files
164
161
 
165
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
166
162
  **IMPORTANT**: Never browse local HTML files via `file://` protocol. Always serve via local server:
167
163
  **Why**: `file://` protocol blocks many browser features (CORS, ES modules, fetch API, service workers). Local server ensures proper HTTP behavior.
168
164
 
@@ -176,7 +172,7 @@ python -m http.server 3000 --directory ./dist &
176
172
  node "$SKILL_DIR/navigate.js" --url http://localhost:3000
177
173
  ```
178
174
 
179
- **Note**: when port 3000 is busy, find an available port with `lsof -i :3000` and use a different one.
175
+ **Note**: when port 3000 is busy, find its owner with `lsof -i :3000`; stop it if you started it, otherwise ask the user. Do not move to another port (`rules/process-management.md`).
180
176
 
181
177
  ## Quick Start
182
178
 
@@ -207,11 +203,10 @@ chrome-devtools auto-detects Chrome at standard OS paths and uses it automatical
207
203
 
208
204
  ### Manual Configuration
209
205
 
210
- To force a specific Chrome installation, copy `.env.example` to `.env` and set `CHROME_EXECUTABLE_PATH`:
206
+ To force a specific Chrome installation, export `CHROME_EXECUTABLE_PATH` (or `PUPPETEER_EXECUTABLE_PATH`) in the shell that runs the scripts; they read the environment, not a `.env` file:
211
207
 
212
208
  ```bash
213
- cp "$SKILL_DIR/.env.example" "$SKILL_DIR/.env"
214
- # Edit .env and set CHROME_EXECUTABLE_PATH to your Chrome executable
209
+ export CHROME_EXECUTABLE_PATH="/path/to/chrome"
215
210
  ```
216
211
 
217
212
  ### Skip Chromium Download
@@ -249,7 +244,6 @@ node "$SKILL_DIR/navigate.js" --url about:blank --close true
249
244
 
250
245
  ## Available Scripts
251
246
 
252
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
253
247
  All in `packages/spec/src/claude/skills/chrome-devtools/scripts/`:
254
248
 
255
249
  | Script | Purpose |
@@ -281,15 +275,14 @@ All in `packages/spec/src/claude/skills/chrome-devtools/scripts/`:
281
275
 
282
276
  ## Writing Custom Test Scripts
283
277
 
284
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
285
- For complex automation, write scripts to `<project>/packages/spec/src/claude/chrome-devtools/tmp/`:
278
+ For complex automation, write scripts to `$SKILL_DIR/../tmp/` (beside `scripts/`, so the `../scripts/lib/browser.js` import resolves):
286
279
 
287
280
  ```bash
288
281
  # Create tmp directory for test scripts
289
- mkdir -p $SKILL_DIR/packages/spec/src/claude/chrome-devtools/tmp
282
+ mkdir -p "$SKILL_DIR/../tmp"
290
283
 
291
284
  # Write a test script
292
- cat > $SKILL_DIR/packages/spec/src/claude/chrome-devtools/tmp/login-test.js << 'EOF'
285
+ cat > "$SKILL_DIR/../tmp/login-test.js" << 'EOF'
293
286
  import { getBrowser, getPage, disconnectBrowser, outputJSON } from '../scripts/lib/browser.js';
294
287
 
295
288
  async function loginTest() {
@@ -315,7 +308,7 @@ loginTest();
315
308
  EOF
316
309
 
317
310
  # Run the test
318
- node $SKILL_DIR/packages/spec/src/claude/chrome-devtools/tmp/login-test.js
311
+ node "$SKILL_DIR/../tmp/login-test.js"
319
312
  ```
320
313
 
321
314
  **Key principles for custom scripts**:
@@ -327,11 +320,7 @@ node $SKILL_DIR/packages/spec/src/claude/chrome-devtools/tmp/login-test.js
327
320
 
328
321
  ## Screenshots
329
322
 
330
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
331
-
332
- **IMPORTANT:** Store browser artifacts in a project-local screenshots or reports folder and include exact output paths in the final report.
333
-
334
- Store screenshots for analysis in `<project>/packages/spec/src/claude/chrome-devtools/screenshots/`:
323
+ Store screenshots in `<project>/packages/spec/src/claude/chrome-devtools/screenshots/` and give their exact output paths in the final report:
335
324
 
336
325
  ```bash
337
326
  # Basic screenshot
@@ -356,15 +345,13 @@ node "$SKILL_DIR/screenshot.js" --url https://example.com --output ./packages/sp
356
345
  node "$SKILL_DIR/screenshot.js" --url https://example.com --output ./packages/spec/src/claude/chrome-devtools/screenshots/page.png --max-size 3
357
346
 
358
347
  # Disable compression
359
- node "$SKILL_DIR/screenshot.js" --url https://example.com --output ./packages/spec/src/claude/chrome-devtools/screenshots/page.png --no-compress
348
+ node "$SKILL_DIR/screenshot.js" --url https://example.com --output ./packages/spec/src/claude/chrome-devtools/screenshots/page.png --no-compress true
360
349
  ```
361
350
 
362
351
  Store screenshots for analysis in `<project>/packages/spec/src/claude/chrome-devtools/screenshots/`.
363
352
 
364
353
  ## Console Log Collection & Analysis
365
354
 
366
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
367
-
368
355
  ### Capture Logs
369
356
 
370
357
  ```bash
@@ -407,7 +394,6 @@ node "$SKILL_DIR/console.js" --url https://example.com --types error --duration
407
394
 
408
395
  ## Finding Elements
409
396
 
410
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
411
397
  Use `snapshot.js` to discover selectors before interacting:
412
398
 
413
399
  ```bash
@@ -423,12 +409,11 @@ node "$SKILL_DIR/snapshot.js" --url https://example.com | jq '.elements[] | sele
423
409
 
424
410
  ## Error Recovery
425
411
 
426
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
427
412
  If script fails:
428
413
 
429
414
  ```bash
430
415
  # 1. Capture current state (without navigating to preserve state)
431
- node "$SKILL_DIR/screenshot.js" --output ./packages/spec/src/claude/skills/chrome-devtools/screenshots/debug.png
416
+ node "$SKILL_DIR/screenshot.js" --output ./packages/spec/src/claude/chrome-devtools/screenshots/debug.png
432
417
 
433
418
  # 2. Get console errors
434
419
  node "$SKILL_DIR/console.js" --url about:blank --types error --duration 1000
@@ -469,22 +454,20 @@ node "$SKILL_DIR/performance.js" --url https://example.com | jq '.vitals'
469
454
  All scripts support:
470
455
  - `--headless true/false` - Override auto-detected headless mode (default: auto by OS)
471
456
  - `--close true` - Close browser completely (default: stay running)
472
- - `--timeout 30000` - Set timeout (ms)
473
- - `--wait-until networkidle2` - Wait strategy
457
+ - `--wait-until networkidle2` - Wait strategy when the script loads `--url`
458
+ - `--timeout <ms>` - read by the scripts that load a page or wait for one (`navigate.js`, `click.js`, `fill.js`, `connect-chrome.js`, `import-cookies.js`, `inject-auth.js`)
474
459
 
475
460
  `navigate.js` additionally supports:
476
461
  - `--wait-for-login <pattern>` - Interactive login: open headed, wait for URL regex match
477
462
  - `--login-timeout <ms>` - Max wait for login completion (default: 300000 = 5 min)
478
463
 
479
464
  ## Troubleshooting
480
- Skills can exist in **project-scope** or **user-scope**. Priority: project-scope > user-scope.
481
-
482
465
  | Error | Solution |
483
466
  |-------|----------|
484
467
  | `Cannot find package 'puppeteer'` | Run `npm install` in scripts directory |
485
468
  | `libnss3.so` missing (Linux) | Run `./install-deps.sh` |
486
469
  | Element not found | Use `snapshot.js` to find correct selector |
487
- | Script hangs | Use `--timeout 60000` or `--wait-until load` |
470
+ | Script hangs | Use `--wait-until load`, or `--timeout 60000` on a script that reads it |
488
471
  | Screenshot >5MB | Auto-compressed; use `--max-size 3` for lower |
489
472
  | Session stale | Delete `.browser-session.json` and retry |
490
473
 
@@ -12,118 +12,50 @@ metadata:
12
12
  ---
13
13
  # Code Review — correctness and compliance owner
14
14
 
15
- Review evaluates correctness, security, scope, architecture, and specification
16
- compliance. It does not execute the test suite, create a canonical execution
17
- receipt, or turn a missing test result into a review-owned proof. `cf:test`
18
- owns execution proof; the single closeout owner combines both results.
15
+ Review evaluates correctness, security, scope, architecture, and specification compliance. It does not execute the test suite, create a canonical execution receipt, or turn a missing test result into a review-owned proof. `cf:test` owns execution proof; the single closeout owner combines both results.
19
16
 
20
17
  ## Input and depth
21
18
 
22
- With no argument, review the pending diff. Supported targets are a PR, commit,
23
- pending changes, or an explicit path. Load only current target bytes and needed
24
- references. For a valid process-first target, read `plan.md`, the active flat
25
- `task-NN-*.md`, and the controller-validated `test-proof-v1` handoff. Mixed,
26
- orphaned, malformed, symlinked, nonregular, or identity-conflicting packet state
27
- is `BLOCKED`; review never migrates it.
19
+ With no argument, review the pending diff. Supported targets are a PR, commit, pending changes, or an explicit path. Load only current target bytes and needed references. For a valid process-first target, read `plan.md`, the active flat `task-NN-*.md`, and the controller-validated `test-proof-v1` handoff. Orphaned, malformed, symlinked, nonregular, or identity-conflicting packet state is `BLOCKED`; review never migrates it.
28
20
 
29
- For process-first proof consumption, this skill's `## Execution-proof boundary`
30
- is authoritative. Do not load or follow legacy separate-receipt paragraphs from
31
- references; they apply only to a legacy packet.
21
+ For proof consumption, this skill's `## Execution-proof boundary` is authoritative.
32
22
 
33
- Select review depth from `assurance_level`, risk, and blast radius. Lane is a
34
- derived view:
23
+ Select review depth from risk and blast radius: for a process-first task, its coverage-profile Risk/evidence. Lane is a derived view:
35
24
 
36
25
  - Direct: targeted correctness/security/spec check;
37
26
  - Standard: bounded feature review at closeout;
38
27
  - Critical: independent, adversarial review covering every required obligation.
39
28
 
40
- Do not use file count as the depth selector. `execution_tier` is a read-only
41
- legacy adapter and cannot choose a review sequence. The review contract has no
42
- fixed Light/Standard/Deep sequence.
29
+ Do not use file count as the depth selector. The review contract has no fixed Light/Standard/Deep sequence.
43
30
 
44
- ## Review stages
31
+ ## Standards
45
32
 
46
- ### 1. Specification compliance
33
+ **Specification compliance.** For process-first work, compare the diff with current plan scope and the active task's Outcome, Scope, Coverage, Ownership, Acceptance, Dependencies, Verification Plan, and declared runtime reachability. Identify missing behavior, unjustified extras, contract substitution, orphaned outputs, and incorrect completion claims. If a design image or document carries requirements, load its multimodal reference only when needed; do not guess from a filename.
47
34
 
48
- For process-first work, compare the diff with current plan scope and the active
49
- task's Outcome, Scope, Coverage, Ownership, Acceptance, Dependencies,
50
- Verification Plan, and declared runtime reachability. Identify missing behavior,
51
- unjustified extras, contract substitution, orphaned outputs, and incorrect
52
- completion claims. If a design image or document carries requirements, load its
53
- multimodal reference only when needed; do not guess from a filename.
35
+ **Correctness and security.** Trace changed entrypoints and callers. Check boundary validation, error paths, resource handling, race assumptions, secrets, authorization, persistence, and failure recovery in proportion to risk. Apply YAGNI/KISS/DRY as maintainability signals, not as a numeric score.
54
36
 
55
- ### 2. Correctness and security
56
-
57
- Trace changed entrypoints and callers. Check boundary validation, error paths,
58
- resource handling, race assumptions, secrets, authorization, persistence, and
59
- failure recovery in proportion to risk. Apply YAGNI/KISS/DRY as maintainability
60
- signals, not as a numeric score.
61
-
62
- ### 3. Adversarial checks
63
-
64
- Try empty, malformed, unauthorized, duplicate, stale, boundary, and concurrent
65
- inputs where the changed contract makes them relevant. For Critical obligations,
66
- review the required independent evidence and provenance. A marker such as
67
- `Audit: PASS` is not independent evidence.
68
-
69
- The independent-audit proof must be a durable object with exactly
70
- `schema_version: "1"`, distinct concrete `reviewer_session_id` and
71
- `implementation_session_id`, `expected_provenance: { base, head }` matching the
72
- runtime binding, concrete `evidence`, and literal `verdict: "PASS"`.
73
- `independent: true`, `PASS_WITH_WARNINGS`, missing binding, or reused session
74
- provenance is insufficient.
37
+ **Adversarial checks.** Try empty, malformed, unauthorized, duplicate, stale, boundary, and concurrent inputs where the changed contract makes them relevant. For Critical obligations, review the required independent evidence and provenance. A marker such as `Audit: PASS` is not independent evidence.
75
38
 
76
39
  ## Test-run boundary
77
40
 
78
- Review reads code; it does not run tests. Never run the project's test suite or a
79
- test file, not even as a sanity check. A read-only run of the reviewed code (for
80
- example `node -e` on the changed function) may reproduce a defect; cite it as a
81
- reproduction, never as test evidence. Never report a test result, pass count, or
82
- exit code as the review's evidence. Without a `test-proof-v1` handoff, write the
83
- proof line exactly as `**Execution proof:** unavailable (owned by cf:test)` and do
84
- not otherwise say whether tests pass; the review still returns its correctness
85
- verdict.
41
+ Review reads code; it does not run tests. Never run the project's test suite or a test file, not even as a sanity check. A read-only run of the reviewed code (for example `node -e` on the changed function) may reproduce a defect; cite it as a reproduction, never as test evidence. Never report a test result, pass count, or exit code as the review's evidence. Without a `test-proof-v1` handoff, write the proof line exactly as `**Execution proof:** unavailable (owned by cf:test)` and do not otherwise say whether tests pass; the review still returns its correctness verdict.
86
42
 
87
43
  ## Execution-proof boundary
88
44
 
89
- For process-first work, consume only the controller-validated `test-proof-v1`
90
- handoff. Require its exact closed schema, stable digest, current Base/Head,
91
- target task, exact command, exit/counts, raw output, reachability, proof level,
92
- artifacts, branches, and redactions. Unknown keys/verdicts, duplicate or missing
93
- branches, stale provenance, zero execution, required skips, unsafe redaction, or
94
- `PASS_WITH_WARNINGS` remain unfinished. Never create or search for a separate
95
- process-first receipt; Develop alone writes Status and inline `## Receipt` after
96
- proof and review are both literal `PASS`.
97
-
98
- Never rerun commands to manufacture proof. If execution proof is missing or
99
- invalid, write the proof line from the test-run boundary and leave closeout
100
- unfinished; do not claim feature PASS from review alone. A review may still return a correctness
101
- verdict when its review inputs are complete, but that verdict is not execution
102
- proof or GATE-DONE approval.
45
+ For process-first work, consume only the controller-validated `test-proof-v1` handoff. Require its exact closed schema, stable digest, current Base/Head, target task, exact command, exit/counts, raw output, reachability, proof level, artifacts, branches, and redactions. Unknown keys/verdicts, duplicate or missing branches, stale provenance, zero execution, required skips, unsafe redaction, or `PASS_WITH_WARNINGS` remain unfinished. Never create or search for a separate process-first receipt; Develop alone writes Status and inline `## Receipt` after proof and review are both literal `PASS`.
46
+
47
+ Never rerun commands to manufacture proof. If execution proof is missing or invalid, write the proof line from the test-run boundary and leave closeout unfinished; do not claim feature PASS from review alone. A review may still return a correctness verdict when its review inputs are complete, but that verdict is not execution proof or GATE-DONE approval.
103
48
 
104
49
  ## Severity
105
50
 
106
- Rate each finding by its production impact. Write the labels `Critical`, `High`,
107
- `Medium`, and `Low` verbatim in English, whatever language the report uses.
108
-
109
- - Critical: a concrete failure a user or operator hits that loses or corrupts
110
- data, breaks security, or stops the product (a login bypass).
111
- - High: a concrete wrong result a user or operator hits (an order exactly at a
112
- tier boundary priced with the wrong discount).
113
- - Medium: a real risk with a failure scenario that has not reached users (a
114
- changed boundary with no test; a leftover debug log).
115
- - Low: cleanup, clarity, or a question (a naming nit; a behavior the change's
116
- README or docs state as intended).
117
-
118
- A leftover debug log is at most Medium; if it prints a secret or credential,
119
- report that exposure as a separate security finding at its own severity. A
120
- behavior the change's README or docs state as intended is not a Medium or
121
- heavier defect; raise it as Low or a question. Task and spec compliance findings
122
- are Critical only when a task or spec is supplied, and there `UNVERIFIED` means
123
- supplied proof that failed, never proof that is unavailable. A blocking Medium is
124
- one with a concrete failure before merge. A review whose heaviest remaining
125
- finding is a non-blocking Medium returns `PASS_WITH_WARNINGS`; one with only Low
126
- findings returns `PASS`.
51
+ Rate each finding by its production impact. Write the labels `Critical`, `High`, `Medium`, and `Low` verbatim in English, whatever language the report uses.
52
+
53
+ - Critical: a concrete failure a user or operator hits that loses or corrupts data, breaks security, or stops the product (a login bypass).
54
+ - High: a concrete wrong result a user or operator hits (an order exactly at a tier boundary priced with the wrong discount).
55
+ - Medium: a real risk with a failure scenario that has not reached users (a changed boundary with no test; a leftover debug log).
56
+ - Low: cleanup, clarity, or a question (a naming nit; a behavior the change's README or docs state as intended).
57
+
58
+ A leftover debug log is at most Medium; if it prints a secret or credential, report that exposure as a separate security finding at its own severity. A behavior the change's README or docs state as intended is not a Medium or heavier defect; raise it as Low or a question. Task and spec compliance findings are Critical only when a task or spec is supplied, and there `UNVERIFIED` means supplied proof that failed, never proof that is unavailable. A blocking Medium is one with a concrete failure before merge. A review whose heaviest remaining finding is a non-blocking Medium returns `PASS_WITH_WARNINGS`; one with only Low findings returns `PASS`.
127
59
 
128
60
  ## Verdict
129
61
 
@@ -131,19 +63,9 @@ Use the shared adapter surface exactly:
131
63
 
132
64
  `PASS | PASS_WITH_WARNINGS | FAIL | BLOCKED`
133
65
 
134
- Legacy adapter inputs may include `PASS | FAIL | BLOCKED`, but they are
135
- normalized to the shared surface and no second enum is allowed. `PASS` means no
136
- Critical, High, or Medium finding remains; Low findings may remain.
137
- `PASS_WITH_WARNINGS` means the heaviest remaining finding is a non-blocking
138
- Medium. `FAIL` means a Critical, High, or blocking Medium finding requires
139
- remediation. Finding count never selects depth or overrides missing execution
140
- proof. A review `PASS_WITH_WARNINGS` remains an unfinished
141
- closeout result; only literal `PASS` can finish a task. `BLOCKED` means the review input or a user-owned
142
- decision is unavailable.
66
+ No second verdict enum is allowed. `PASS` means no Critical, High, or Medium finding remains; Low findings may remain. `PASS_WITH_WARNINGS` means the heaviest remaining finding is a non-blocking Medium. `FAIL` means a Critical, High, or blocking Medium finding requires remediation. Finding count never selects depth or overrides missing execution proof. A review `PASS_WITH_WARNINGS` remains an unfinished closeout result; only literal `PASS` can finish a task. `BLOCKED` means the review input or a user-owned decision is unavailable.
143
67
 
144
- Copy the header line `# Code Review Results [cf:code-review]`, the field labels,
145
- and the severity labels verbatim in English; write the content in the user's
146
- language.
68
+ Copy the header line `# Code Review Results [cf:code-review]`, the field labels, and the severity labels verbatim in English; write the content in the user's language.
147
69
 
148
70
  ```markdown
149
71
  # Code Review Results [cf:code-review]
@@ -163,15 +85,10 @@ language.
163
85
  - Reachability/provenance review: PASS | WARN | FAIL
164
86
  ```
165
87
 
166
- Do not add a test command, a fabricated receipt, or an `Audit: PASS` marker to
167
- make the review look complete. Return unresolved questions at the end.
88
+ Do not add a test command, a fabricated receipt, or an `Audit: PASS` marker to make the review look complete. Return unresolved questions at the end.
168
89
 
169
90
  ## References
170
91
 
171
- - `references/spec-compliance-review.md` — load only its detailed scope checks;
172
- its separate-receipt paragraph is Legacy-only.
92
+ - `references/spec-compliance-review.md` — load for its detailed scope checks.
173
93
  - `references/pre-landing-checklists.md` — load for the selected risk surface.
174
94
  - `references/adversarial-review.md` — load for Critical/adversarial depth.
175
- - `references/verification-gate.md` — Legacy separate-receipt consumption only;
176
- process-first proof uses this skill's execution-proof boundary. Execution
177
- always stays with `cf:test`.
@@ -24,15 +24,12 @@ Do not attempt a standard text-based review if the project includes Visual Specs
24
24
  - requirement bullets
25
25
  - task `Outcome`, `Scope`, `Anchors and Ownership`, `Changes`, `Acceptance`,
26
26
  `Dependencies`, and `Verification Plan`
27
- - typed `coordination.boundaries` as the only ownership/DAG/proof/parallel authority
28
- - task `Verification Plan`
29
- - canonical contracts/invariants from `design.md`
27
+ - the plan's acceptance criteria and coverage profile rows the task references
30
28
  Then verify the changed files against those concrete obligations.
31
29
 
32
- Execution proof is separate from the task plan. Consume
33
- `receipts/<task-basename>.md` first and legacy `## Evidence` only as fallback;
34
- conflicting proof identities fail closed. Review never creates a receipt and
35
- never treats a receipt as approval, readiness, audit status, or semantic judgment.
30
+ Execution proof is separate from the task plan and lives only in the task's
31
+ inline `## Receipt`. Review never creates a receipt and never treats a receipt as
32
+ approval, readiness, audit status, or semantic judgment.
36
33
 
37
34
  ## 3. Verdict Scale
38
35