xtrm-tools 2.4.0 → 2.4.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 (125) hide show
  1. package/README.md +23 -9
  2. package/cli/dist/index.cjs +774 -240
  3. package/cli/dist/index.cjs.map +1 -1
  4. package/cli/package.json +1 -1
  5. package/config/hooks.json +10 -0
  6. package/config/pi/extensions/core/adapter.ts +2 -14
  7. package/config/pi/extensions/core/guard-rules.ts +70 -0
  8. package/config/pi/extensions/core/session-state.ts +59 -0
  9. package/config/pi/extensions/main-guard.ts +10 -14
  10. package/config/pi/extensions/plan-mode/README.md +65 -0
  11. package/config/pi/extensions/plan-mode/index.ts +340 -0
  12. package/config/pi/extensions/plan-mode/utils.ts +168 -0
  13. package/config/pi/extensions/service-skills.ts +51 -7
  14. package/config/pi/extensions/session-flow.ts +117 -0
  15. package/hooks/beads-claim-sync.mjs +123 -2
  16. package/hooks/beads-compact-restore.mjs +41 -9
  17. package/hooks/beads-compact-save.mjs +36 -5
  18. package/hooks/beads-gate-messages.mjs +27 -1
  19. package/hooks/beads-stop-gate.mjs +58 -8
  20. package/hooks/guard-rules.mjs +86 -0
  21. package/hooks/hooks.json +28 -18
  22. package/hooks/main-guard.mjs +3 -21
  23. package/hooks/quality-check.cjs +1286 -0
  24. package/hooks/quality-check.py +345 -0
  25. package/hooks/session-state.mjs +138 -0
  26. package/package.json +2 -1
  27. package/project-skills/quality-gates/.claude/settings.json +1 -24
  28. package/skills/creating-service-skills/SKILL.md +433 -0
  29. package/skills/creating-service-skills/references/script_quality_standards.md +425 -0
  30. package/skills/creating-service-skills/references/service_skill_system_guide.md +278 -0
  31. package/skills/creating-service-skills/scripts/bootstrap.py +326 -0
  32. package/skills/creating-service-skills/scripts/deep_dive.py +304 -0
  33. package/skills/creating-service-skills/scripts/scaffolder.py +482 -0
  34. package/skills/scoping-service-skills/SKILL.md +231 -0
  35. package/skills/scoping-service-skills/scripts/scope.py +74 -0
  36. package/skills/sync-docs/SKILL.md +235 -0
  37. package/skills/sync-docs/evals/evals.json +89 -0
  38. package/skills/sync-docs/references/doc-structure.md +104 -0
  39. package/skills/sync-docs/references/schema.md +103 -0
  40. package/skills/sync-docs/scripts/context_gatherer.py +246 -0
  41. package/skills/sync-docs/scripts/doc_structure_analyzer.py +495 -0
  42. package/skills/sync-docs/scripts/validate_doc.py +365 -0
  43. package/skills/sync-docs-workspace/iteration-1/benchmark.json +293 -0
  44. package/skills/sync-docs-workspace/iteration-1/benchmark.md +13 -0
  45. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/eval_metadata.json +27 -0
  46. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/outputs/result.md +210 -0
  47. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/grading.json +28 -0
  48. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/timing.json +1 -0
  49. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/outputs/result.md +101 -0
  50. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/grading.json +28 -0
  51. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/timing.json +5 -0
  52. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/timing.json +5 -0
  53. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/eval_metadata.json +27 -0
  54. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/outputs/result.md +198 -0
  55. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/grading.json +28 -0
  56. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/timing.json +1 -0
  57. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/outputs/result.md +94 -0
  58. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/grading.json +28 -0
  59. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/timing.json +1 -0
  60. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/eval_metadata.json +27 -0
  61. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/outputs/result.md +237 -0
  62. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/grading.json +28 -0
  63. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/timing.json +1 -0
  64. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/outputs/result.md +134 -0
  65. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/grading.json +28 -0
  66. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/timing.json +1 -0
  67. package/skills/sync-docs-workspace/iteration-2/benchmark.json +297 -0
  68. package/skills/sync-docs-workspace/iteration-2/benchmark.md +13 -0
  69. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/eval_metadata.json +27 -0
  70. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/outputs/result.md +137 -0
  71. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/grading.json +92 -0
  72. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/timing.json +1 -0
  73. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/outputs/result.md +134 -0
  74. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/grading.json +86 -0
  75. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/timing.json +1 -0
  76. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/eval_metadata.json +27 -0
  77. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/outputs/result.md +193 -0
  78. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/grading.json +72 -0
  79. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/timing.json +1 -0
  80. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/outputs/result.md +211 -0
  81. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/grading.json +91 -0
  82. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/timing.json +5 -0
  83. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/eval_metadata.json +27 -0
  84. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/outputs/result.md +182 -0
  85. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/grading.json +95 -0
  86. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/timing.json +1 -0
  87. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/outputs/result.md +222 -0
  88. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/grading.json +88 -0
  89. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/timing.json +5 -0
  90. package/skills/sync-docs-workspace/iteration-3/benchmark.json +298 -0
  91. package/skills/sync-docs-workspace/iteration-3/benchmark.md +13 -0
  92. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/eval_metadata.json +27 -0
  93. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/outputs/result.md +125 -0
  94. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/grading.json +97 -0
  95. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/timing.json +5 -0
  96. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/outputs/result.md +144 -0
  97. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/grading.json +78 -0
  98. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/timing.json +5 -0
  99. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/eval_metadata.json +27 -0
  100. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/outputs/result.md +104 -0
  101. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/grading.json +91 -0
  102. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/timing.json +5 -0
  103. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/outputs/result.md +79 -0
  104. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/grading.json +82 -0
  105. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/timing.json +5 -0
  106. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/eval_metadata.json +27 -0
  107. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase1_context.json +302 -0
  108. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase2_drift.txt +33 -0
  109. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase3_analysis.json +114 -0
  110. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase4_fix.txt +118 -0
  111. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase5_validate.txt +38 -0
  112. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/result.md +158 -0
  113. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/grading.json +95 -0
  114. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/timing.json +5 -0
  115. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/outputs/result.md +71 -0
  116. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/grading.json +90 -0
  117. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/timing.json +5 -0
  118. package/skills/updating-service-skills/SKILL.md +136 -0
  119. package/skills/updating-service-skills/scripts/drift_detector.py +222 -0
  120. package/skills/using-quality-gates/SKILL.md +254 -0
  121. package/skills/using-service-skills/SKILL.md +108 -0
  122. package/skills/using-service-skills/scripts/cataloger.py +74 -0
  123. package/skills/using-service-skills/scripts/skill_activator.py +152 -0
  124. package/skills/using-service-skills/scripts/test_skill_activator.py +58 -0
  125. package/skills/using-xtrm/SKILL.md +34 -38
@@ -0,0 +1,433 @@
1
+ ---
2
+ name: creating-service-skills
3
+ description: >-
4
+ Generate operational service skill packages for any service in the project.
5
+ Produces SKILL.md documentation, diagnostic scripts, and references through a
6
+ mandatory two-phase workflow. Use when onboarding to a new service, adding a
7
+ new skill, or when a skill is missing from the catalog.
8
+ allowed-tools: Bash(python3 *), Read, Grep, Glob
9
+ ---
10
+
11
+ # Creating Service Skills
12
+
13
+ ## Role: The Architect
14
+
15
+ You are the **Service Skills Architect**. Your job is to produce complete, operational
16
+ skill packages for project services — not stubs, not placeholders. The output must be
17
+ immediately useful to any agent working on the service.
18
+
19
+ ---
20
+
21
+ ## Mandatory Two-Phase Workflow
22
+
23
+ **Use both phases every time.** Phase 1 gives structure; Phase 2 grounds the skill in real service behavior.
24
+
25
+ ---
26
+
27
+ ### Phase 1: Automated Skeleton (Always First)
28
+
29
+ Run the scaffolder to build a structural skeleton from static analysis of
30
+ `docker-compose*.yml`, `Dockerfile`, and dependency files. It also detects
31
+ technologies and auto-populates official documentation links.
32
+
33
+ ```bash
34
+ # Create a skeleton for a service
35
+ python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/scaffolder.py" \
36
+ create <service-id> <territory-path> "<description>"
37
+
38
+ # Example
39
+ python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/scaffolder.py" \
40
+ create auth-service src/auth/ "JWT authentication and session management"
41
+ ```
42
+
43
+ The skeleton creates at `.claude/skills/<service-id>/`:
44
+ - `SKILL.md` with `[PENDING RESEARCH]` markers
45
+ - `scripts/health_probe.py` stub
46
+ - `scripts/log_hunter.py` stub
47
+ - `scripts/data_explorer.py` stub
48
+ - `references/deep_dive.md` research checklist
49
+
50
+ **The skeleton is never sufficient.** It has structural facts but no semantic knowledge.
51
+
52
+ Classify the service type to determine which specialist script to add:
53
+
54
+ ```bash
55
+ python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/deep_dive.py" \
56
+ classify <territory-path>
57
+ ```
58
+
59
+ Print the full Phase 2 research agenda:
60
+
61
+ ```bash
62
+ python3 "$CLAUDE_PROJECT_DIR/.claude/skills/creating-service-skills/scripts/deep_dive.py" \
63
+ questions <service-type>
64
+ ```
65
+
66
+ ---
67
+
68
+ ### Phase 2: Agentic Deep Dive
69
+
70
+ After the skeleton exists, answer every research question by reading the actual
71
+ source code. Use **Serena LSP tools exclusively** — never read entire files.
72
+
73
+ #### Serena Tool Protocol for Deep Dive
74
+
75
+ | What you need to find | Serena tool to use |
76
+ |---|---|
77
+ | Module/class structure | `get_symbols_overview(relative_path, depth=1)` |
78
+ | Body of a specific function | `find_symbol(name_path, include_body=True)` |
79
+ | Log/error message strings | `search_for_pattern("logger.error|raise|except")` |
80
+ | All SQL queries | `search_for_pattern("SELECT|INSERT|UPDATE|COPY")` |
81
+ | Env var usage | `search_for_pattern("os.getenv|os.environ|settings\\.")` |
82
+ | Data flow (who calls what) | `find_referencing_symbols(name_path, relative_path)` |
83
+ | Entry point detection | `search_for_pattern('if __name__|def main|async def main')` |
84
+ | Docker port mapping | `search_for_pattern("ports:|DB_PORT|POSTGRES_PORT")` |
85
+ | **Actual table names** | `execute_db_query("SELECT tablename FROM pg_tables WHERE schemaname='public'")` |
86
+ | **Actual column names** | `execute_db_query("SELECT column_name, data_type FROM information_schema.columns WHERE table_name='X'")` |
87
+
88
+ **Do NOT read entire files.** Map first → read only the symbols you need.
89
+
90
+ #### Required Research Sections
91
+
92
+ **Container & Runtime**
93
+ - Exact entry point (Dockerfile CMD + docker-compose `command:`)
94
+ - Critical env vars that crash the service if missing (no default)
95
+ - Volumes read from / written to
96
+ - Service type: daemon / one-shot / cron?
97
+ - Restart policy and `depends_on:` conditions
98
+
99
+ **Data Layer** — verify ALL of these against the live DB before writing any scripts:
100
+ - Run `SELECT tablename FROM pg_tables WHERE schemaname='public'` → get exact table list
101
+ - For each output table: run `SELECT column_name, data_type FROM information_schema.columns WHERE table_name='<table>'` → get exact column names
102
+ - Confirm which tables have a timestamp column and which do not (use `COUNT(*)` freshness check for tables with no timestamp)
103
+ - Which tables does it WRITE vs. only READ?
104
+ - Realistic stale threshold per table (in minutes)
105
+ - Redis/S3/file state usage
106
+ - SQL parameterization: flag any f-string SQL
107
+
108
+ **Failure Modes** — build this table with ≥5 rows from real exception handlers:
109
+
110
+ | Symptom | Likely Cause | Resolution |
111
+ |---------|-------------|------------|
112
+ | (log output) | (root cause) | (exact fix command) |
113
+
114
+ **Log Patterns** — source from actual codebase, not invented:
115
+ - `search_for_pattern("logger.info|logging.info")` → `info` patterns
116
+ - `search_for_pattern("logger.error|logger.warning")` → `error/warning`
117
+ - `search_for_pattern("logger.critical|panic!")` → `critical`
118
+
119
+ ---
120
+
121
+ ### Phase 2 Script Writing (Complete Implementation)
122
+
123
+ After research is complete, replace all `[PENDING RESEARCH]` stubs in `scripts/`.
124
+ Scripts should be ready to run end-to-end, without TODO markers or placeholder SQL.
125
+
126
+ #### Mandatory DB Connection Pattern (all scripts that touch the DB)
127
+
128
+ ```python
129
+ from dotenv import load_dotenv
130
+ from pathlib import Path
131
+ import sys
132
+
133
+ project_root = Path(__file__).resolve().parent.parent.parent.parent.parent
134
+ env_file = project_root / ".env"
135
+ if env_file.exists():
136
+ load_dotenv(str(env_file))
137
+
138
+ sys.path.insert(0, str(project_root))
139
+ from shared.db_pool_manager import execute_db_query
140
+ ```
141
+
142
+ Never use raw `psycopg2` or hardcoded credentials. Always use `execute_db_query` from
143
+ `shared.db_pool_manager`. The `.env` load is mandatory — scripts without it will fail
144
+ when the environment is clean.
145
+
146
+ #### Script Integrity Rules
147
+
148
+ 1. **Schema first** — query `information_schema` before writing any SQL. Never guess table or column names.
149
+ 2. **Every `try` has an `except`** — incomplete try/except blocks crash silently. Every DB call must be wrapped with a matching except that captures the error into the result.
150
+ 3. **Function names match call sites** — after renaming any function, search for all call sites and update them.
151
+ 4. **`qwen -y` for delegation** — when delegating Phase 2 to Qwen, always pass the `-y` flag (YOLO/non-interactive mode) otherwise Qwen will research but never write files.
152
+ 5. **No `ccs gemini`** — Gemini is invoked as `gemini -p "..."` directly; GLM is `env -u CLAUDECODE ccs glm -p "..."`; Qwen is `qwen -y "..."`.
153
+ 6. **`venv/bin/python3` for testing** — diagnostic scripts must be tested with the project venv, not system python, which may lack `dotenv` and other deps.
154
+
155
+ #### `scripts/health_probe.py`
156
+
157
+ Required features:
158
+ - `check_container()`: `docker inspect -f {{.State.Running}} <container>`
159
+ - `check_table_freshness()`: `SELECT MAX(<ts_col>) FROM <table>` — compare vs stale threshold
160
+ - Use **external mapped port** (e.g. 5433 for host), NOT container-internal port (5432)
161
+ - Print exact fix command on failure: `docker compose restart <service>` or SQL correction
162
+ - Support `--json` flag for machine-readable output
163
+
164
+ ```python
165
+ STALE_CHECKS = [
166
+ {"table": "actual_table", "ts_col": "created_at", "stale_minutes": 10},
167
+ ]
168
+ DB_PORT = 5433 # external mapped port — verify in docker-compose.yml
169
+ ```
170
+
171
+ #### `scripts/log_hunter.py`
172
+
173
+ Required features:
174
+ - PATTERNS list sourced from actual codebase error strings (not generic names)
175
+ - Severity bucketing: `critical → error → warning → info`
176
+ - `--tail N`, `--since <time>`, `--errors-only`, `--json` flags
177
+ - Print specific fix command when critical pattern detected
178
+
179
+ ```python
180
+ # RIGHT — from actual codebase
181
+ PATTERNS = [
182
+ ("OAuth expired", r"invalid_grant|token.*expired", "critical"),
183
+ ("PDF parse error", r"PdfReadError|pdf.*format.*changed", "error"),
184
+ ("Report saved", r"report.*ingested|saved.*DB", "info"),
185
+ ]
186
+ # WRONG — never use generic patterns
187
+ PATTERNS = [("Error", r"ERROR|Exception|ConnectionError", "error")]
188
+ ```
189
+
190
+ #### `scripts/data_explorer.py`
191
+
192
+ Required features:
193
+ - Real table name, correct external DB_PORT
194
+ - All queries parameterized: `WHERE symbol = %s` (never f-strings in SQL)
195
+ - `--limit`, `--json`, `--symbol` flags
196
+ - Read-only: no INSERT/UPDATE/DELETE
197
+
198
+ #### Specialist Script (based on service type)
199
+
200
+ | Service Type | Script | Core Logic |
201
+ |---|---|---|
202
+ | `continuous_db_writer` | `data_explorer.py` | DISTINCT ON latest-per-symbol |
203
+ | `http_api_server` | `endpoint_tester.py` | Probe real routes, check response codes |
204
+ | `one_shot_migration` | `coverage_checker.py` | Verify expected schema/table exists |
205
+ | `file_watcher` | `state_inspector.py` | Mount accessible + state file present |
206
+ | `scheduled_poller` | `auth_checker.py` | Token file present + not expired |
207
+
208
+ See [references/script_quality_standards.md](references/script_quality_standards.md) for complete templates.
209
+
210
+ #### `scripts/Makefile` (required)
211
+
212
+ The scaffolder creates a stub `Makefile` in Phase 1. In Phase 2, verify it is
213
+ correct and complete because it is the primary entry point for diagnostics.
214
+
215
+ **Standard template** (copy verbatim, replace `<service-id>` comment only):
216
+
217
+ ```makefile
218
+ # Skill diagnostic scripts for <service-id>
219
+ # Usage: make <target> (from this directory)
220
+ # Override python: make health PYTHON=/path/to/python3
221
+
222
+ # Auto-detect: prefer project venv (4 levels up), fall back to system python3
223
+ _VENV := $(wildcard ../../../../venv/bin/python3)
224
+ PYTHON ?= $(if $(_VENV),../../../../venv/bin/python3,python3)
225
+
226
+ .PHONY: health health-json data data-json logs errors db help
227
+
228
+ help:
229
+ @echo "Available targets:"
230
+ @echo " health - Run health probe (human readable)"
231
+ @echo " health-json - Run health probe (JSON output)"
232
+ @echo " data - Show latest DB records"
233
+ @echo " data-json - Show latest DB records (JSON, limit 5)"
234
+ @echo " logs - Tail and analyze recent logs"
235
+ @echo " errors - Show errors/criticals only"
236
+ @echo " db - Run DB helper example queries"
237
+ @echo ""
238
+ @echo "Python: $(PYTHON)"
239
+
240
+ health:
241
+ $(PYTHON) health_probe.py
242
+
243
+ health-json:
244
+ $(PYTHON) health_probe.py --json
245
+
246
+ data:
247
+ $(PYTHON) data_explorer.py
248
+
249
+ data-json:
250
+ $(PYTHON) data_explorer.py --json --limit 5
251
+
252
+ logs:
253
+ $(PYTHON) log_hunter.py --tail 50
254
+
255
+ errors:
256
+ $(PYTHON) log_hunter.py --errors-only --tail 50
257
+
258
+ db:
259
+ $(PYTHON) db_helper.py
260
+ ```
261
+
262
+ **Rules for the delegated Phase 2 agent:**
263
+
264
+ 1. **Keep standard targets stable** — avoid removing or renaming them because downstream workflows depend on them.
265
+ 2. **Add service-specific targets** below the standard block if the service needs them (e.g. `make auth`, `make schema`, `make backfill`).
266
+ 3. **Keep the `_VENV` auto-detect path (`../../../../venv/bin/python3`) unchanged** — it resolves from `scripts/` → service dir → `skills/` → `.claude/` → project root → `venv/`.
267
+ 4. **Use real tab characters in recipe lines** so Makefile parsing works consistently.
268
+ 5. **Run `make help` after updates** and confirm the Python path resolves to the project venv.
269
+
270
+ ---
271
+
272
+ ## Official Documentation Auto-Population
273
+
274
+ The scaffolder detects technologies from:
275
+ - `docker-compose*.yml` image tags
276
+ - `requirements.txt` / `pyproject.toml` package names
277
+ - `Cargo.toml` crate names
278
+ - `package.json` dependencies
279
+
280
+ And automatically adds relevant official documentation links to the `## References`
281
+ section of the generated SKILL.md. Verify these links are correct during Phase 2.
282
+
283
+ ---
284
+
285
+ ## Phase 3: Hook Registration (After Phase 2)
286
+
287
+ Once the skill is complete, verify that the `PreToolUse` skill activator hook is
288
+ wired in the project's `.claude/settings.json`. It should already be there if
289
+ you ran `install-service-skills.py` — but confirm it, and explain it to the user.
290
+
291
+ ### What the hook does
292
+
293
+ The `skill_activator.py` hook fires **before** any `Read`, `Write`, `Edit`, `Grep`,
294
+ `Glob`, or `Bash` operation. It checks whether the operation touches a registered
295
+ service territory (from `service-registry.json`). If it does, it injects:
296
+
297
+ ```
298
+ [Service Skill] You are about to work with the '<service-id>' service territory.
299
+ Load the expert skill before proceeding: Read .claude/skills/<service-id>/SKILL.md
300
+ The skill contains: operational knowledge, failure modes, diagnostic scripts,
301
+ and the correct methods for managing this service.
302
+ Do not use ad-hoc approaches (raw SQL, improvised docker commands) when the
303
+ skill defines the correct method.
304
+ ```
305
+
306
+ This means: from the moment the skill is registered, Claude will **automatically**
307
+ be reminded to load and apply it whenever working on relevant files or running
308
+ commands that mention the service — without you having to ask.
309
+
310
+ ### Verify hook is active
311
+
312
+ Check `.claude/settings.json` contains a `PreToolUse` entry:
313
+
314
+ ```json
315
+ "PreToolUse": [{
316
+ "matcher": "Read|Write|Edit|Glob|Grep|Bash",
317
+ "hooks": [{"type": "command",
318
+ "command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/skills/using-service-skills/scripts/skill_activator.py\""}]
319
+ }]
320
+ ```
321
+
322
+ If missing, run the installer again or add it manually.
323
+
324
+ ### Verify the service is registered
325
+
326
+ ```bash
327
+ python3 .claude/skills/using-service-skills/scripts/cataloger.py
328
+ ```
329
+
330
+ The service should appear in the output catalog. If not, the territory may not
331
+ be registered in `service-registry.json` — re-run the scaffolder for Phase 1.
332
+
333
+ ### Communicate to the user
334
+
335
+ After completing Phase 3, confirm:
336
+
337
+ ```
338
+ ✅ Hook registered: '<service-id>' skill is now auto-activated.
339
+
340
+ Whenever you (or I) work with files in <territory> or run commands mentioning
341
+ '<service-id>', I will automatically load .claude/skills/<service-id>/SKILL.md
342
+ and apply its expert knowledge — including using the correct diagnostic scripts
343
+ instead of ad-hoc queries.
344
+ ```
345
+
346
+ ---
347
+
348
+ ## Skill Completion Checklist
349
+
350
+ A skill is **complete** (not a draft) when ALL of these are true:
351
+
352
+ **Schema verification (before writing any script):**
353
+ - [ ] `SELECT tablename FROM pg_tables WHERE schemaname='public'` run — real table names confirmed
354
+ - [ ] `SELECT column_name, data_type FROM information_schema.columns WHERE table_name='X'` run per output table
355
+ - [ ] Tables with no timestamp column identified — `COUNT(*)` used for freshness check instead
356
+
357
+ **Script completeness:**
358
+ - [ ] No `[PENDING RESEARCH]` markers remain in SKILL.md
359
+ - [ ] Service type classified and documented
360
+ - [ ] All scripts use mandatory DB connection pattern (`dotenv` + `shared.db_pool_manager`)
361
+ - [ ] `health_probe.py`: real container check + actual table freshness + fix commands; every `try` has `except`
362
+ - [ ] `log_hunter.py`: patterns sourced from codebase, not invented; severity bucketed
363
+ - [ ] `data_explorer.py`: real table + real column names + parameterized SQL
364
+ - [ ] `db_helper.py`: example queries against real tables with correct column names
365
+ - [ ] At least one specialist script for the service type
366
+ - [ ] All function names consistent between definition and call sites
367
+ - [ ] Troubleshooting table has ≥5 rows from real failure modes
368
+ - [ ] All docker compose commands verified against actual config
369
+ - [ ] All scripts support `--json` flag
370
+ - [ ] `scripts/Makefile` generated with standard targets: `health`, `health-json`, `data`, `data-json`, `logs`, `errors`, `db`
371
+ - [ ] Scripts tested with `venv/bin/python3` (not system python3) — 0 import errors
372
+
373
+ **Registration:**
374
+ - [ ] `references/deep_dive.md` Phase 2 checklist completed
375
+ - [ ] Official docs links in References section verified
376
+ - [ ] Service registered in `.claude/skills/service-registry.json`
377
+ - [ ] `PreToolUse` skill activator hook confirmed in `.claude/settings.json`
378
+ - [ ] User informed: skill auto-activates on territory file access and service-name commands
379
+
380
+ ---
381
+
382
+ ## Output Format
383
+
384
+ After successful completion:
385
+
386
+ ```
387
+ ✅ Created expert skill: `<service-id>`
388
+
389
+ **Classification**: <service-type> (confidence: high/medium/low)
390
+ **Territory**: <file patterns>
391
+ **Specialist Script**: <script-name.py>
392
+ **Health Strategy**: <strategy>
393
+ **Skill Path**: `.claude/skills/<service-id>/SKILL.md`
394
+ **Official Docs**: <detected technologies>
395
+
396
+ **Phase 2 Status**: Complete
397
+ - [PENDING RESEARCH] markers: 0
398
+ - Scripts implemented: health_probe.py, log_hunter.py, data_explorer.py, <specialist>.py
399
+
400
+ **Phase 3 Status**: Hook registered
401
+ - PreToolUse activator: confirmed in settings.json
402
+ - Auto-activation: triggers on territory files + service name in commands
403
+
404
+ ⚠️ If Phase 2 is incomplete, the skill is NOT ready for use.
405
+ ⚠️ If Phase 3 is skipped, the skill exists but will not enforce itself.
406
+ ```
407
+
408
+ ---
409
+
410
+ ## Tool Restrictions
411
+
412
+ Write to:
413
+ - ✅ `.claude/skills/<service-id>/` (new skill packages)
414
+ - ✅ `.claude/skills/service-registry.json` (registration)
415
+
416
+ Do not:
417
+ - ❌ Modify source code outside `.claude/skills/`
418
+ - ❌ Delete existing skills or registry entries
419
+
420
+ ---
421
+
422
+ ## References
423
+
424
+ - [references/script_quality_standards.md](references/script_quality_standards.md) — Script templates and anti-patterns
425
+ - [references/service_skill_system_guide.md](references/service_skill_system_guide.md) — System architecture
426
+ - `scripts/scaffolder.py` — Phase 1 skeleton generator with official docs detection
427
+ - `scripts/deep_dive.py` — Service classifier + Phase 2 research agenda
428
+ - `scripts/bootstrap.py` — Registry CRUD and path resolution utilities
429
+
430
+ ## Related Skills
431
+
432
+ - `/using-service-skills` — Discover and activate expert personas at session start
433
+ - `/updating-service-skills` — Sync skills when implementation drifts