diff --git a/.agents/skills/gstack-browse/SKILL.md b/.agents/skills/gstack-browse/SKILL.md index a4a2dcba..52ebaba8 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 786b66d5..02f9081f 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 8a7d8cbb..57cf6d37 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 99ca54e8..122baf07 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 61885abf..5d24c4af 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 ae8a7e12..f7a9ca79 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 6681da4f..5fcb37e8 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 d759107e..353b08c3 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 a8f032bf..163a6c4d 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 f67502db..75aa4630 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 136b989a..a527e80a 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 f71a79ed..6f334a9c 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 be90a6cf..3bbec6b7 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 096af8cf..c9c084c2 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 a6ccf7c3..c922523e 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 0aee73d9..02b5d704 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 7fcafe0e..5328edbe 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 2c550a95..d146eb81 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 3771e269..5776be0d 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 51dfbb1b..0aea3d6e 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 811eb08f..523552ea 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 5c605d5b..2aab8ec4 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 931f71d8..11ec082a 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 e854214e..68253fa6 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 fdf8a4c2..2e30a2cf 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 ca5c8372..6bf57109 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 11f0a06a..4a476b92 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 921cd3d5..0ad3214e 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 59920798..169c791e 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 206b45d3..fb473c17 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 d8989733..7c4e2a8b 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 41c5e1b6..59af04a5 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 7307fb43..306b0878 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 93d6b087..2934777a 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