From b349769e2e28411fd2b837b4031972f7bbb390cc Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Fri, 20 Mar 2026 08:21:00 -0700 Subject: [PATCH] feat: telemetry epilogue captures error context + regenerate SKILLs Epilogue now instructs Claude to classify errors (error_class from a defined taxonomy), write a one-line error_message, and identify the failed_step. All 33 SKILL.md files regenerated. Co-Authored-By: Claude Opus 4.6 (1M context) --- .agents/skills/gstack-browse/SKILL.md | 22 ++++++++++++++++--- .../gstack-design-consultation/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack-design-review/SKILL.md | 22 ++++++++++++++++--- .../skills/gstack-document-release/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack-investigate/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack-office-hours/SKILL.md | 22 ++++++++++++++++--- .../skills/gstack-plan-ceo-review/SKILL.md | 22 ++++++++++++++++--- .../skills/gstack-plan-design-review/SKILL.md | 22 ++++++++++++++++--- .../skills/gstack-plan-eng-review/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack-qa-only/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack-qa/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack-retro/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack-review/SKILL.md | 22 ++++++++++++++++--- .../gstack-setup-browser-cookies/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack-ship/SKILL.md | 22 ++++++++++++++++--- .agents/skills/gstack/SKILL.md | 22 ++++++++++++++++--- SKILL.md | 22 ++++++++++++++++--- browse/SKILL.md | 22 ++++++++++++++++--- codex/SKILL.md | 22 ++++++++++++++++--- design-consultation/SKILL.md | 22 ++++++++++++++++--- design-review/SKILL.md | 22 ++++++++++++++++--- document-release/SKILL.md | 22 ++++++++++++++++--- investigate/SKILL.md | 22 ++++++++++++++++--- office-hours/SKILL.md | 22 ++++++++++++++++--- plan-ceo-review/SKILL.md | 22 ++++++++++++++++--- plan-design-review/SKILL.md | 22 ++++++++++++++++--- plan-eng-review/SKILL.md | 22 ++++++++++++++++--- qa-only/SKILL.md | 22 ++++++++++++++++--- qa/SKILL.md | 22 ++++++++++++++++--- retro/SKILL.md | 22 ++++++++++++++++--- review/SKILL.md | 22 ++++++++++++++++--- scripts/gen-skill-docs.ts | 22 ++++++++++++++++--- setup-browser-cookies/SKILL.md | 22 ++++++++++++++++--- ship/SKILL.md | 22 ++++++++++++++++--- 34 files changed, 646 insertions(+), 102 deletions(-) diff --git a/.agents/skills/gstack-browse/SKILL.md b/.agents/skills/gstack-browse/SKILL.md index a4a2dcba5..52ebaba8f 100644 --- a/.agents/skills/gstack-browse/SKILL.md +++ b/.agents/skills/gstack-browse/SKILL.md @@ -228,7 +228,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -236,12 +248,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # browse: QA Testing & Dogfooding diff --git a/.agents/skills/gstack-design-consultation/SKILL.md b/.agents/skills/gstack-design-consultation/SKILL.md index 786b66d5c..02f9081f4 100644 --- a/.agents/skills/gstack-design-consultation/SKILL.md +++ b/.agents/skills/gstack-design-consultation/SKILL.md @@ -229,7 +229,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -237,12 +249,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # /design-consultation: Your Design System, Built Together diff --git a/.agents/skills/gstack-design-review/SKILL.md b/.agents/skills/gstack-design-review/SKILL.md index 8a7d8cbb6..57cf6d373 100644 --- a/.agents/skills/gstack-design-review/SKILL.md +++ b/.agents/skills/gstack-design-review/SKILL.md @@ -229,7 +229,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -237,12 +249,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # /design-review: Design Audit → Fix → Verify diff --git a/.agents/skills/gstack-document-release/SKILL.md b/.agents/skills/gstack-document-release/SKILL.md index 99ca54e89..122baf078 100644 --- a/.agents/skills/gstack-document-release/SKILL.md +++ b/.agents/skills/gstack-document-release/SKILL.md @@ -227,7 +227,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -235,12 +247,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/.agents/skills/gstack-investigate/SKILL.md b/.agents/skills/gstack-investigate/SKILL.md index 61885abf8..5d24c4af5 100644 --- a/.agents/skills/gstack-investigate/SKILL.md +++ b/.agents/skills/gstack-investigate/SKILL.md @@ -230,7 +230,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -238,12 +250,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # Systematic Debugging diff --git a/.agents/skills/gstack-office-hours/SKILL.md b/.agents/skills/gstack-office-hours/SKILL.md index ae8a7e124..f7a9ca793 100644 --- a/.agents/skills/gstack-office-hours/SKILL.md +++ b/.agents/skills/gstack-office-hours/SKILL.md @@ -231,7 +231,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -239,12 +251,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # YC Office Hours diff --git a/.agents/skills/gstack-plan-ceo-review/SKILL.md b/.agents/skills/gstack-plan-ceo-review/SKILL.md index 6681da4fd..5fcb37e88 100644 --- a/.agents/skills/gstack-plan-ceo-review/SKILL.md +++ b/.agents/skills/gstack-plan-ceo-review/SKILL.md @@ -230,7 +230,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -238,12 +250,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/.agents/skills/gstack-plan-design-review/SKILL.md b/.agents/skills/gstack-plan-design-review/SKILL.md index d759107ef..353b08c37 100644 --- a/.agents/skills/gstack-plan-design-review/SKILL.md +++ b/.agents/skills/gstack-plan-design-review/SKILL.md @@ -229,7 +229,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -237,12 +249,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/.agents/skills/gstack-plan-eng-review/SKILL.md b/.agents/skills/gstack-plan-eng-review/SKILL.md index a8f032bf8..163a6c4d2 100644 --- a/.agents/skills/gstack-plan-eng-review/SKILL.md +++ b/.agents/skills/gstack-plan-eng-review/SKILL.md @@ -228,7 +228,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -236,12 +248,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # Plan Review Mode diff --git a/.agents/skills/gstack-qa-only/SKILL.md b/.agents/skills/gstack-qa-only/SKILL.md index f67502db4..75aa46305 100644 --- a/.agents/skills/gstack-qa-only/SKILL.md +++ b/.agents/skills/gstack-qa-only/SKILL.md @@ -227,7 +227,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -235,12 +247,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # /qa-only: Report-Only QA Testing diff --git a/.agents/skills/gstack-qa/SKILL.md b/.agents/skills/gstack-qa/SKILL.md index 136b989a8..a527e80a7 100644 --- a/.agents/skills/gstack-qa/SKILL.md +++ b/.agents/skills/gstack-qa/SKILL.md @@ -230,7 +230,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -238,12 +250,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/.agents/skills/gstack-retro/SKILL.md b/.agents/skills/gstack-retro/SKILL.md index f71a79ed7..6f334a9c5 100644 --- a/.agents/skills/gstack-retro/SKILL.md +++ b/.agents/skills/gstack-retro/SKILL.md @@ -227,7 +227,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -235,12 +247,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Detect default branch diff --git a/.agents/skills/gstack-review/SKILL.md b/.agents/skills/gstack-review/SKILL.md index be90a6cf9..3bbec6b75 100644 --- a/.agents/skills/gstack-review/SKILL.md +++ b/.agents/skills/gstack-review/SKILL.md @@ -226,7 +226,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -234,12 +246,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/.agents/skills/gstack-setup-browser-cookies/SKILL.md b/.agents/skills/gstack-setup-browser-cookies/SKILL.md index 096af8cf9..c9c084c20 100644 --- a/.agents/skills/gstack-setup-browser-cookies/SKILL.md +++ b/.agents/skills/gstack-setup-browser-cookies/SKILL.md @@ -226,7 +226,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -234,12 +246,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # Setup Browser Cookies diff --git a/.agents/skills/gstack-ship/SKILL.md b/.agents/skills/gstack-ship/SKILL.md index a6ccf7c3a..c922523ed 100644 --- a/.agents/skills/gstack-ship/SKILL.md +++ b/.agents/skills/gstack-ship/SKILL.md @@ -224,7 +224,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -232,12 +244,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/.agents/skills/gstack/SKILL.md b/.agents/skills/gstack/SKILL.md index 0aee73d99..02b5d7041 100644 --- a/.agents/skills/gstack/SKILL.md +++ b/.agents/skills/gstack/SKILL.md @@ -259,7 +259,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -267,12 +279,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.codex/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. If `PROACTIVE` is `false`: do NOT proactively suggest other gstack skills during this session. diff --git a/SKILL.md b/SKILL.md index 7fcafe0e1..5328edbe9 100644 --- a/SKILL.md +++ b/SKILL.md @@ -265,7 +265,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -273,12 +285,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. If `PROACTIVE` is `false`: do NOT proactively suggest other gstack skills during this session. diff --git a/browse/SKILL.md b/browse/SKILL.md index 2c550a956..d146eb814 100644 --- a/browse/SKILL.md +++ b/browse/SKILL.md @@ -234,7 +234,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -242,12 +254,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # browse: QA Testing & Dogfooding diff --git a/codex/SKILL.md b/codex/SKILL.md index 3771e2699..5776be0d7 100644 --- a/codex/SKILL.md +++ b/codex/SKILL.md @@ -235,7 +235,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -243,12 +255,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/design-consultation/SKILL.md b/design-consultation/SKILL.md index 51dfbb1b1..0aea3d6e5 100644 --- a/design-consultation/SKILL.md +++ b/design-consultation/SKILL.md @@ -239,7 +239,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -247,12 +259,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # /design-consultation: Your Design System, Built Together diff --git a/design-review/SKILL.md b/design-review/SKILL.md index 811eb08fa..523552ea0 100644 --- a/design-review/SKILL.md +++ b/design-review/SKILL.md @@ -239,7 +239,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -247,12 +259,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # /design-review: Design Audit → Fix → Verify diff --git a/document-release/SKILL.md b/document-release/SKILL.md index 5c605d5b3..2aab8ec42 100644 --- a/document-release/SKILL.md +++ b/document-release/SKILL.md @@ -236,7 +236,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -244,12 +256,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/investigate/SKILL.md b/investigate/SKILL.md index 931f71d8c..11ec082ab 100644 --- a/investigate/SKILL.md +++ b/investigate/SKILL.md @@ -249,7 +249,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -257,12 +269,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # Systematic Debugging diff --git a/office-hours/SKILL.md b/office-hours/SKILL.md index e854214e7..68253fa61 100644 --- a/office-hours/SKILL.md +++ b/office-hours/SKILL.md @@ -240,7 +240,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -248,12 +260,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # YC Office Hours diff --git a/plan-ceo-review/SKILL.md b/plan-ceo-review/SKILL.md index fdf8a4c21..2e30a2cf2 100644 --- a/plan-ceo-review/SKILL.md +++ b/plan-ceo-review/SKILL.md @@ -237,7 +237,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -245,12 +257,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/plan-design-review/SKILL.md b/plan-design-review/SKILL.md index ca5c83729..6bf571093 100644 --- a/plan-design-review/SKILL.md +++ b/plan-design-review/SKILL.md @@ -237,7 +237,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -245,12 +257,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/plan-eng-review/SKILL.md b/plan-eng-review/SKILL.md index 11f0a06ae..4a476b927 100644 --- a/plan-eng-review/SKILL.md +++ b/plan-eng-review/SKILL.md @@ -236,7 +236,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -244,12 +256,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # Plan Review Mode diff --git a/qa-only/SKILL.md b/qa-only/SKILL.md index 921cd3d52..0ad3214e1 100644 --- a/qa-only/SKILL.md +++ b/qa-only/SKILL.md @@ -233,7 +233,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -241,12 +253,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # /qa-only: Report-Only QA Testing diff --git a/qa/SKILL.md b/qa/SKILL.md index 59920798f..169c791ee 100644 --- a/qa/SKILL.md +++ b/qa/SKILL.md @@ -240,7 +240,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -248,12 +260,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/retro/SKILL.md b/retro/SKILL.md index 206b45d3d..fb473c179 100644 --- a/retro/SKILL.md +++ b/retro/SKILL.md @@ -234,7 +234,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -242,12 +254,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Detect default branch diff --git a/review/SKILL.md b/review/SKILL.md index d8989733e..7c4e2a8b4 100644 --- a/review/SKILL.md +++ b/review/SKILL.md @@ -235,7 +235,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -243,12 +255,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch diff --git a/scripts/gen-skill-docs.ts b/scripts/gen-skill-docs.ts index 41c5e1b62..59af04a5c 100644 --- a/scripts/gen-skill-docs.ts +++ b/scripts/gen-skill-docs.ts @@ -370,7 +370,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the \`name:\` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- \`ERROR_CLASS\`: a short category — one of: \`timeout\`, \`test_failure\`, \`build_failure\`, + \`git_error\`, \`auth_error\`, \`network_error\`, \`browse_error\`, \`lint_error\`, + \`merge_conflict\`, \`permission_error\`, \`unknown_error\`. Pick the most specific match. +- \`ERROR_MESSAGE\`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: \`"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"\`. Never include file paths, secrets, or PII. +- \`FAILED_STEP\`: which step in the skill workflow failed. Example: \`"run_tests"\`, + \`"create_pr"\`, \`"merge_base"\`, \`"build"\`, \`"qa_browse"\`. Use snake_case, max 30 chars. + +Run this bash: \`\`\`bash _TEL_END=$(date +%s) @@ -378,12 +390,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \\ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \\ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \\ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \\ + --failed-step "FAILED_STEP" 2>/dev/null & \`\`\` Replace \`SKILL_NAME\` with the actual skill name from frontmatter, \`OUTCOME\` with success/error/abort, and \`USED_BROWSE\` with true/false based on whether \`$B\` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For \`ERROR_CLASS\`, \`ERROR_MESSAGE\`, and \`FAILED_STEP\`: use empty string \`""\` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use \`"unknown_error"\`, \`""\`, and \`""\` respectively. This runs in the background and never blocks the user.`; } diff --git a/setup-browser-cookies/SKILL.md b/setup-browser-cookies/SKILL.md index 7307fb43a..306b08785 100644 --- a/setup-browser-cookies/SKILL.md +++ b/setup-browser-cookies/SKILL.md @@ -231,7 +231,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -239,12 +251,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. # Setup Browser Cookies diff --git a/ship/SKILL.md b/ship/SKILL.md index 93d6b0875..2934777ad 100644 --- a/ship/SKILL.md +++ b/ship/SKILL.md @@ -234,7 +234,19 @@ RECOMMENDATION: [what the user should do next] After the skill workflow completes (success, error, or abort), log the telemetry event. Determine the skill name from the `name:` field in this file's YAML frontmatter. Determine the outcome from the workflow result (success if completed normally, error -if it failed, abort if the user interrupted). Run this bash: +if it failed, abort if the user interrupted). + +**For errors:** Also determine: +- `ERROR_CLASS`: a short category — one of: `timeout`, `test_failure`, `build_failure`, + `git_error`, `auth_error`, `network_error`, `browse_error`, `lint_error`, + `merge_conflict`, `permission_error`, `unknown_error`. Pick the most specific match. +- `ERROR_MESSAGE`: a one-line summary of what went wrong (max 200 chars). Include the + command that failed and the key error text. Example: `"bun test: 3 tests failed in + auth.test.ts — expected 200 got 401"`. Never include file paths, secrets, or PII. +- `FAILED_STEP`: which step in the skill workflow failed. Example: `"run_tests"`, + `"create_pr"`, `"merge_base"`, `"build"`, `"qa_browse"`. Use snake_case, max 30 chars. + +Run this bash: ```bash _TEL_END=$(date +%s) @@ -242,12 +254,16 @@ _TEL_DUR=$(( _TEL_END - _TEL_START )) rm -f ~/.gstack/analytics/.pending-"$_SESSION_ID" 2>/dev/null || true ~/.claude/skills/gstack/bin/gstack-telemetry-log \ --skill "SKILL_NAME" --duration "$_TEL_DUR" --outcome "OUTCOME" \ - --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" 2>/dev/null & + --used-browse "USED_BROWSE" --session-id "$_SESSION_ID" \ + --error-class "ERROR_CLASS" --error-message "ERROR_MESSAGE" \ + --failed-step "FAILED_STEP" 2>/dev/null & ``` Replace `SKILL_NAME` with the actual skill name from frontmatter, `OUTCOME` with success/error/abort, and `USED_BROWSE` with true/false based on whether `$B` was used. -If you cannot determine the outcome, use "unknown". This runs in the background and +For `ERROR_CLASS`, `ERROR_MESSAGE`, and `FAILED_STEP`: use empty string `""` if the +outcome is not error. If the outcome is error but you cannot determine the details, +use `"unknown_error"`, `""`, and `""` respectively. This runs in the background and never blocks the user. ## Step 0: Detect base branch