diff --git a/.claude-plugin/agents/cache-analyzer.md b/.claude-plugin/agents/cache-analyzer.md index 7683df7..d6587e0 100644 --- a/.claude-plugin/agents/cache-analyzer.md +++ b/.claude-plugin/agents/cache-analyzer.md @@ -1,6 +1,7 @@ --- name: cache-analyzer description: Analyze disk usage, cache accumulation, and orphaned worktrees in the Buddy Evolver plugin. Use when asked to "analyze cache", "check disk usage", "find orphaned worktrees", or "cache report". +model: inherit tools: - Bash - Read diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index faaf97d..393da9c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -25,7 +25,7 @@ cheap Ubuntu checks run in GitHub Actions automatically. Before requesting review, run the full local suite on macOS: - [ ] `make test-all` — all 9 tiers pass (328 tests: smoke / unit / security / integration / functional / UI / e2e / snapshots / docs) -- [ ] `scripts/upload-test-results.sh` — Check Run appears on this PR's head commit +- [ ] `scripts/upload-test-results.sh` — run after push, **before** opening this PR (posts commit status that CI checks immediately) - [ ] If touching UI: `scripts/test-visual-smoke.sh` — visual checks pass, screenshot attached below **Additional checks (run when relevant):** diff --git a/.github/workflows/ci-verify-local.yml b/.github/workflows/ci-verify-local.yml index 7e3eb61..e9f75eb 100644 --- a/.github/workflows/ci-verify-local.yml +++ b/.github/workflows/ci-verify-local.yml @@ -2,14 +2,14 @@ name: Verify Local Tests # Checks that the contributor has run local tests and uploaded results. # Accepts two forms of evidence (in order of preference): -# 1. A "Local Tests (macOS)" Check Run on the head commit (created by -# upload-test-results.sh when the token has checks:write via GitHub App) +# 1. A "Local Tests (macOS)" commit status on the head commit (created by +# upload-test-results.sh using the Statuses API — works with any +# repo-scoped PAT, no GitHub App required) # 2. A PR comment from upload-test-results.sh containing the results table -# (fallback used when only a PAT is available -- public-repo Checks API -# requires GitHub App auth) +# (fallback used if the Statuses API call fails) # # If neither is found, posts a sticky comment asking the contributor to run -# scripts/test-all.sh && scripts/upload-test-results.sh. +# scripts/test-all.sh && scripts/upload-test-results.sh after pushing. # # SECURITY: All event data flows through env: variables. No direct # ${{ github.event.* }} interpolation in run: blocks. @@ -41,22 +41,14 @@ jobs: run: | set -euo pipefail - # ── Option 1: Check Run (requires GitHub App token) ──────── - runs_json=$(gh api "repos/$REPO/commits/$HEAD_SHA/check-runs" --paginate) - status=$(echo "$runs_json" | python3 -c ' - import json, sys - data = json.load(sys.stdin) - runs = data.get("check_runs", []) - matches = [r for r in runs if r.get("name") == "Local Tests (macOS)"] - if not matches: - print("missing") - else: - print(matches[0].get("conclusion", "unknown")) - ') - - if [ "$status" != "missing" ]; then - echo "status=$status" >> "$GITHUB_OUTPUT" - echo "Found Check Run with status: $status" + # ── Option 1: Commit status (any repo-scoped PAT) ────────── + state=$(gh api "repos/$REPO/commits/$HEAD_SHA/status" \ + --jq '[.statuses[] | select(.context == "Local Tests (macOS)") | .state][0]' \ + 2>/dev/null || echo "") + + if [ -n "$state" ] && [ "$state" != "null" ]; then + echo "status=$state" >> "$GITHUB_OUTPUT" + echo "Found commit status: $state" exit 0 fi diff --git a/CLAUDE.md b/CLAUDE.md index 9cfaea6..db15ad8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -43,13 +43,13 @@ scripts/test-smoke.sh Smoke tier: build sanity + CLI contract (<30s, scripts/test-security.sh Security validation test suite (~25 tests) scripts/test-ui.sh Buddy card rendering against fixtures (23 tests) scripts/test-snapshots.sh Golden file comparison for CLI output (6 tests) -scripts/test-docs.sh Documentation path + link + count consistency (16 tests) +scripts/test-docs.sh Documentation path + link + count consistency (18 tests) scripts/test-perf.sh Performance benchmarks (7 benchmarks, on-demand) scripts/coverage.sh Local HTML coverage report (test-results/coverage/) scripts/test-ui-renderer.py Standalone Python renderer (reference for /buddy-status) scripts/test-visual-smoke.sh Manual pre-release visual check (interactive) scripts/test-all.sh Master runner — all tiers, JSON/JUnit output -scripts/upload-test-results.sh Uploads results to GitHub as a Check Run +scripts/upload-test-results.sh Uploads results to GitHub as a commit status scripts/bump-version.sh Atomic version bump across plugin.json + marketplace.json + README badge scripts/update-changelog.sh Move [Unreleased] content to dated [X.Y.Z] section in CHANGELOG.md scripts/setup-labels.sh One-time GitHub label setup for new/forked repos @@ -170,19 +170,21 @@ Four workflows in `.github/workflows/`: ### Local → GitHub bridge -`scripts/upload-test-results.sh` reads `test-results/results.json` and POSTs a GitHub Check Run via `gh api`. On permission failure (e.g. forks without `checks:write`), falls back to `gh pr comment`. +`scripts/upload-test-results.sh` reads `test-results/results.json` and POSTs a commit status via the GitHub Statuses API (any repo-scoped PAT — no GitHub App required). Run this **after pushing but before opening the PR** so CI finds the status the moment the PR is created. Falls back to `gh pr comment` if the Statuses API fails. ### Contributor workflow 1. Edit code on macOS. 2. Run `scripts/test-all.sh` — all 6 tiers must pass. -3. Run `scripts/upload-test-results.sh` — results appear as a Check Run on the current commit. -4. Push the branch, open a PR. -5. `ci-quality.yml` runs on Ubuntu; `ci-verify-local.yml` confirms the Check Run is present and green. -6. Maintainer reviews and merges. +3. Commit and push the branch (Desktop App or `git push`). +4. Run `scripts/upload-test-results.sh` — posts a commit status on the pushed commit. +5. Open a PR — `ci-verify-local.yml` finds the commit status and passes immediately. +6. `ci-quality.yml` runs on Ubuntu; maintainer reviews and merges. ## Automations +**Session skills** (`/start-session` through `/session-exit`) are coordination-only — they run at your current main-session model and do not dispatch subagents. Only the agents below have a `model:` field that specifies an independent model for that agent's work. + ### Hook: session-start context injection A `SessionStart` hook in `hooks/hooks.json` runs `hooks/session-start.sh` at the start of each Claude Code session. **Dynamic discovery**: parses frontmatter from every SKILL.md, agent markdown file, and hook definition to emit up-to-date lists with no hardcoded drift. Compares the current branch to `origin/main` via a cached `git fetch` (5-min TTL) and warns if >10 commits behind. Always exits 0 (never blocks session startup). Timeout: 10s. @@ -204,11 +206,14 @@ Plan → Execute transition checkpoint. Run after a plan is approved (Plan Mode Pre-commit wrap-up. Run BEFORE clicking the Desktop App's "Commit Changes" button. Unconditional linear pipeline: 1. Token review with `--apply --force` 2. Full test pipeline via `scripts/test-all.sh` — all 6 tiers -3. Upload results to GitHub as a Check Run via `scripts/upload-test-results.sh` -4. Security review via `security-reviewer` agent (conditional on Swift changes) -5. Sync docs via `/sync-docs` -6. Comment review via the `comment-reviewer` Haiku agent -7. Unified summary table +3. Security review via `security-reviewer` agent (conditional on Swift changes) +4. Sync docs via `/sync-docs` +5. Comment review via the `comment-reviewer` Haiku agent +6. Unified summary table + reminder to run `scripts/upload-test-results.sh` after push + +### Phase 4: GitHub (commit / PR / merge) + +Handled via the Desktop App buttons — no Claude Code automation at this phase by design. Keeping humans at the publish gate. ### Skill: /session-deploy diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a929d8..8b3e232 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -176,4 +176,4 @@ use `findAll()`, assert byte-length, add `[DRY RUN]` branch, call - Swift changes trigger the `security-reviewer` agent (read-only, reviews for validation gaps, byte-length violations, unsafe patterns) - Maintainer checks byte-length invariant compliance on all patcher changes -- CI must pass before merge: `ci-quality.yml` (lint/JSON/hygiene, runs on Ubuntu) and `ci-verify-local.yml` (confirms that `scripts/test-all.sh && scripts/upload-test-results.sh` has posted a passing Check Run on the head commit) +- CI must pass before merge: `ci-quality.yml` (lint/JSON/hygiene, runs on Ubuntu) and `ci-verify-local.yml` (confirms that `scripts/test-all.sh && scripts/upload-test-results.sh` has posted a passing commit status on the head commit — run the upload after push, before opening the PR) diff --git a/README.md b/README.md index c1bc7c4..19fc071 100644 --- a/README.md +++ b/README.md @@ -574,13 +574,13 @@ bash scripts/test-all.sh | Snapshots | `scripts/test-snapshots.sh` | full-system | Golden file comparison for CLI output | | Docs | `scripts/test-docs.sh` | peripheral | Documentation path + link + count consistency | -**CI** is local-first: `ci-quality.yml` runs on Ubuntu for every PR (shellcheck, JSON/YAML validation, hygiene checks). macOS-dependent tests run on contributor machines via `scripts/test-all.sh && scripts/upload-test-results.sh`; `ci-verify-local.yml` blocks merge until the upload appears and passes. +**CI** is local-first: `ci-quality.yml` runs on Ubuntu for every PR (shellcheck, JSON/YAML validation, hygiene checks). macOS-dependent tests run on contributor machines via `scripts/test-all.sh && scripts/upload-test-results.sh`; `ci-verify-local.yml` blocks merge until a passing commit status appears. Run the upload after pushing but before opening the PR. Run everything locally: ```bash bash scripts/test-all.sh # all 6 tiers, emits test-results/results.json -bash scripts/upload-test-results.sh # publish as GitHub Check Run on this commit +bash scripts/upload-test-results.sh # post commit status (run after push, before PR) bash scripts/coverage.sh # local HTML coverage → test-results/coverage/index.html ``` @@ -600,8 +600,9 @@ rather than opening a public issue. See [SECURITY.md](SECURITY.md) for details. 3. Make your changes 4. Run `swift test --package-path scripts/BuddyPatcher && bash scripts/test-security.sh` 5. Run `bash scripts/test-all.sh` — all 6 tiers must pass -6. Run `bash scripts/upload-test-results.sh` to post results as a Check Run -7. Open a PR against `main` — the [PR template](.github/PULL_REQUEST_TEMPLATE.md) will guide you +6. Commit and push the branch +7. Run `bash scripts/upload-test-results.sh` — posts commit status on the pushed commit +8. Open a PR against `main` — `ci-verify-local.yml` will find the status immediately **Key constraints** — if you modify the Swift source in `scripts/BuddyPatcher/`: diff --git a/agents/security-reviewer.md b/agents/security-reviewer.md index c0c0f5f..f03ddda 100644 --- a/agents/security-reviewer.md +++ b/agents/security-reviewer.md @@ -29,7 +29,7 @@ description: Use this agent when code changes are made to BuddyPatcher Swift fil -model: inherit +model: sonnet color: red tools: ["Read", "Grep", "Glob"] --- diff --git a/scripts/test-docs.sh b/scripts/test-docs.sh index 407bb60..24b363b 100755 --- a/scripts/test-docs.sh +++ b/scripts/test-docs.sh @@ -12,6 +12,7 @@ # 8. hooks/hooks.json shell scripts exist on disk # 9. Session workflow skills (session-end, session-deploy) only reference real files # 10. Retired skills (buddy, test-patch, update-species-map) stay retired +# 11. session-execute agent model table matches all agent frontmatter # # Output: "Results: N passed, M failed" on the last line. set -uo pipefail @@ -419,6 +420,80 @@ fi echo +# ── Group 11: Agent model table drift check ────────────────────── +# +# Validates that the agent model table in skills/session-execute/SKILL.md +# matches the actual model: fields in each agent's frontmatter. +# Prevents the table from silently drifting when an agent's model is changed. + +echo " --- Group 11: Agent model table drift ---" +echo + +drift_output=$(python3 - <<'PY' +import re, pathlib, sys + +content = pathlib.Path("skills/session-execute/SKILL.md").read_text() + +# Find the code block that starts with "Component Model Recommendations" +code_block_match = re.search( + r'```\nComponent Model Recommendations\n(.*?)```', + content, re.DOTALL +) +if not code_block_match: + print("ERROR: Could not find model table in skills/session-execute/SKILL.md") + sys.exit(1) + +table_text = code_block_match.group(1) + +# Agent rows follow the "Agent Model Configured in" header and its rule line, +# and end before the next box-drawing rule line. +agent_section_match = re.search( + r'Agent\s+Model\s+Configured in\n.+\n((?:.+\n)+)', + table_text +) +if not agent_section_match: + print("ERROR: Could not parse agent section from model table") + sys.exit(1) + +rows = [] +for line in agent_section_match.group(1).splitlines(): + line = line.strip() + if not line or not line[0].isalpha(): + break # stop at closing rule line (box-drawing chars are not alpha) + parts = line.split() + if len(parts) >= 3: + rows.append((parts[0], parts[1], parts[2])) + +mismatches = [] +for agent_name, expected_model, agent_file in rows: + try: + agent_content = pathlib.Path(agent_file).read_text() + m = re.search(r'^model:\s*(\S+)', agent_content, re.MULTILINE) + actual = m.group(1) if m else "inherit" + if actual != expected_model: + mismatches.append( + f"{agent_name}: table={expected_model!r} frontmatter={actual!r} ({agent_file})" + ) + except FileNotFoundError: + mismatches.append(f"{agent_name}: agent file missing: {agent_file}") + +for msg in mismatches: + print(f" {msg}") +sys.exit(1 if mismatches else 0) +PY +) +drift_exit=$? + +if [ "$drift_exit" -eq 0 ]; then + assert_pass "Agent model table in /session-execute matches all agent frontmatter" "0" +else + echo " [FAIL] Agent model table drift detected:" + echo "$drift_output" + FAILED=$((FAILED + 1)) +fi + +echo + # ── Summary ──────────────────────────────────────────────────────── echo "Results: $PASSED passed, $FAILED failed" diff --git a/scripts/upload-test-results.sh b/scripts/upload-test-results.sh index 3e85782..b2ff0de 100755 --- a/scripts/upload-test-results.sh +++ b/scripts/upload-test-results.sh @@ -1,22 +1,24 @@ #!/bin/bash -# Upload local test results as a GitHub Check Run. +# Upload local test results as a GitHub commit status. # # Reads test-results/results.json (produced by test-all.sh) and creates a -# Check Run on the current commit via the GitHub Checks API. This is the -# local-to-CI bridge: macOS-dependent tests run on the contributor's machine, -# but GitHub sees the pass/fail state alongside the Ubuntu-side quality checks. +# commit status on the current commit via the GitHub Statuses API. This is +# the local-to-CI bridge: macOS-dependent tests run on the contributor's +# machine, but GitHub sees the pass/fail state alongside the Ubuntu-side +# quality checks. # # Requires: -# - gh CLI authenticated with a token that has `checks:write` on the repo +# - gh CLI authenticated with a repo-scoped token (no GitHub App needed) # - test-results/results.json from a prior test-all.sh run -# - Must be run from inside the repo (git rev-parse used to locate commit) +# - Must be run AFTER the commit is pushed — the commit SHA must exist on +# the remote before CI fires (run before opening the PR) # # Usage: -# scripts/upload-test-results.sh # create Check Run on HEAD +# scripts/upload-test-results.sh # post commit status on HEAD # scripts/upload-test-results.sh --dry-run # print payload, don't POST # -# Fallback: if the Checks API isn't available (missing perms, no PR), the -# script tries to comment on the current PR instead (gh pr comment). +# Fallback: if the Statuses API fails, the script tries to comment on the +# current PR instead (gh pr comment). set -uo pipefail @@ -162,6 +164,8 @@ PY TITLE=$(echo "$SUMMARY_JSON" | python3 -c "import json,sys; print(json.load(sys.stdin)['title'])") SUMMARY=$(echo "$SUMMARY_JSON" | python3 -c "import json,sys; print(json.load(sys.stdin)['summary'])") CONCLUSION=$(echo "$SUMMARY_JSON" | python3 -c "import json,sys; print(json.load(sys.stdin)['conclusion'])") +TOTAL_PASSED=$(echo "$SUMMARY_JSON" | python3 -c "import json,sys; print(json.load(sys.stdin)['total_passed'])") +TOTAL_TESTS=$(echo "$SUMMARY_JSON" | python3 -c "import json,sys; print(json.load(sys.stdin)['total_tests'])") echo echo " Uploading test results for:" @@ -172,49 +176,41 @@ echo " title: $TITLE" echo if [ "$DRY_RUN" -eq 1 ]; then - echo " [DRY RUN] would POST to /repos/$REPO_SLUG/check-runs" + STATE=$( [ "$CONCLUSION" = "success" ] && echo "success" || echo "failure" ) + echo " [DRY RUN] would POST to /repos/$REPO_SLUG/statuses/$COMMIT_SHA" + echo " state: $STATE" + echo " context: Local Tests (macOS)" + echo " description: $TOTAL_PASSED/$TOTAL_TESTS passed" echo - echo " Summary body:" - echo " ─────────────" + echo " Summary body (PR comment fallback):" + echo " ────────────────────────────────────" echo "$SUMMARY" - echo " ─────────────" + echo " ────────────────────────────────────" exit 0 fi -# ── Create Check Run via Checks API ──────────────────────────────── +# ── Create commit status via Statuses API ────────────────────────── +# Works with any repo-scoped PAT — no GitHub App required. -CHECK_RUN_PAYLOAD=$(python3 - <&1) + -f state="$STATE" \ + -f context="Local Tests (macOS)" \ + -f description="$DESCRIPTION" 2>&1) STATUS=$? if [ "$STATUS" -eq 0 ]; then - CHECK_URL=$(echo "$RESPONSE" | python3 -c "import json,sys; print(json.load(sys.stdin).get('html_url', ''))" 2>/dev/null || echo "") - echo " [+] Check Run created" - [ -n "$CHECK_URL" ] && echo " $CHECK_URL" + echo " [+] Commit status posted (context: Local Tests (macOS), state: $STATE)" exit 0 fi # ── Fallback: PR comment ──────────────────────────────────────────── -echo " [!] Checks API failed (likely missing checks:write perm)" +echo " [!] Statuses API failed" echo " Response: $RESPONSE" | head -3 echo " [~] Falling back to PR comment..." diff --git a/skills/session-end/SKILL.md b/skills/session-end/SKILL.md index f6fe5be..7eb8b44 100644 --- a/skills/session-end/SKILL.md +++ b/skills/session-end/SKILL.md @@ -1,6 +1,6 @@ --- name: session-end -description: Use when wrapping up a dev session on Buddy Evolver before committing via the Desktop App. Runs the full test-all.sh pipeline, uploads results as a GitHub Check Run, applies token optimizations, syncs docs, and audits comments. Use when the user says "end session", "wrap up", "done for now", "finish up", "session done", "close out", or "ready to commit". +description: Use when wrapping up a dev session on Buddy Evolver before committing via the Desktop App. Runs the full test-all.sh pipeline, applies token optimizations, syncs docs, and audits comments. Use when the user says "end session", "wrap up", "done for now", "finish up", "session done", "close out", or "ready to commit". --- # End Session — Pre-Commit Wrap-Up @@ -13,13 +13,12 @@ This skill is linear — no conditional branches. Every step runs every time. Th 1. **Token review (--apply --force)** — apply token optimizations to skills/configs 2. **Full test pipeline** — `scripts/test-all.sh` (~181 tests, 6 tiers) -3. **Upload results as GitHub Check Run** — `scripts/upload-test-results.sh` -4. **Security review (conditional)** — `security-reviewer` agent if Swift files changed -5. **Sync docs** — fix drift in CLAUDE.md and README.md -6. **Comment review** — Haiku agent audits inline comments in changed files -7. **Summary report** — unified table with all results and next-step guidance +3. **Security review (conditional)** — `security-reviewer` agent if Swift files changed +4. **Sync docs** — fix drift in CLAUDE.md and README.md +5. **Comment review** — Haiku agent audits inline comments in changed files +6. **Summary report** — unified table with all results and next-step guidance -Token review runs BEFORE tests so the test pipeline validates the optimized code. Security review runs AFTER tests because the Swift code needs to compile cleanly before security analysis is meaningful, and BEFORE docs sync so security issues get flagged before documentation describes them. Comment review runs AFTER tests so only code that already passes tests is audited. +Token review runs BEFORE tests so the test pipeline validates the optimized code. Security review runs AFTER tests because the Swift code needs to compile cleanly before security analysis is meaningful, and BEFORE docs sync so security issues get flagged before documentation describes them. Comment review runs AFTER tests so only code that already passes tests is audited. The GitHub upload (`scripts/upload-test-results.sh`) runs AFTER commit+push — not in this skill — because the new commit SHA doesn't exist until the Desktop App "Commit Changes" button is clicked. ## Step 1: Detect changes @@ -77,20 +76,7 @@ Parse `test-results/results.json` for the summary table. Expected: ~181/~181 pas If any tier fails, continue the pipeline but mark the session as `FAIL` in the final summary and list the failing tier(s). -## Step 4: Upload results to GitHub - -After `test-all.sh`, upload results so `ci-verify-local.yml` can see them: - -```bash -bash "${CLAUDE_PLUGIN_ROOT}/scripts/upload-test-results.sh" 2>&1 -``` - -Handle three outcomes: -- **Success**: upload created a Check Run — capture the URL for the summary -- **No PR yet**: script reports "no PR for branch" — note "upload deferred, will happen after `git push`" in summary -- **Tests failed in Step 3**: skip upload; flag in summary as "skipped (tests failed)" - -## Step 5: Security review (conditional) +## Step 3: Security review (conditional) If the changed file list from Step 1 includes any files under `scripts/BuddyPatcher/Sources/**/*.swift`, dispatch the `security-reviewer` agent (defined at `agents/security-reviewer.md`, model: inherit). Otherwise, skip this step with "skipped (no Swift changes)". @@ -102,7 +88,7 @@ The agent returns a structured report with PASS/WARN/FAIL items across: input va Capture counts: `N_pass`, `N_warn`, `N_fail`. Surface the summary for the unified report. If any `FAIL` items exist, mark the session as requiring attention — but continue the pipeline (non-blocking). -## Step 6: Sync docs +## Step 4: Sync docs Invoke `/sync-docs` to detect and fix drift in CLAUDE.md and README.md. The skill uses the `docs-reviewer` agent internally. @@ -111,7 +97,7 @@ Capture: - `N edits applied` — report counts per file - `drift detected, edits declined` — report the drift list for manual review -## Step 7: Comment review (Haiku agent) +## Step 5: Comment review (Haiku agent) Dispatch the `comment-reviewer` agent (defined at `agents/comment-reviewer.md`, model: haiku) to audit inline comments in the files changed during this session. @@ -123,7 +109,7 @@ The agent returns a structured report with these sections: `MISSING_COMMENT`, `T Surface the summary's status (`CLEAN` or `REVIEW_NEEDED`). If `REVIEW_NEEDED`, show the top 5 flagged items verbatim and mention that the full report is available. -## Step 8: Unified summary report +## Step 6: Unified summary report Print this report exactly: @@ -151,11 +137,6 @@ Full test suite (scripts/test-all.sh): ─────────────────────────────────── TOTAL ~181/~181 ~30s ✅ -CI upload (Local Tests (macOS) Check Run): - ✅ created: https://github.com/Soul-Craft/buddy-evolver/... - [or] ⚠ deferred (no PR yet — will upload after first push) - [or] ⏭ skipped (tests failed above) - Security review: ✅ N pass, K warnings [or] ⚠ F failures (see list below) [or] ⏭ skipped (no Swift changes) @@ -169,8 +150,10 @@ Git status: vs origin/main: N ahead, M behind ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -Next: Use the Desktop App's "Commit Changes" button. -CI will verify via ci-verify-local.yml using the Check Run above. +Next: Use the Desktop App's "Commit Changes" button, then push. +After pushing — BEFORE creating the PR — run: + bash scripts/upload-test-results.sh +CI checks for this commit status the moment the PR is opened. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ``` diff --git a/skills/session-execute/SKILL.md b/skills/session-execute/SKILL.md index e8bf642..c72fd2b 100644 --- a/skills/session-execute/SKILL.md +++ b/skills/session-execute/SKILL.md @@ -46,7 +46,7 @@ comment-reviewer haiku agents/comment-reviewer.md test-runner haiku agents/test-runner.md token-review haiku .claude-plugin/agents/token-review.md docs-reviewer haiku .claude-plugin/agents/docs-reviewer.md -security-reviewer inherit agents/security-reviewer.md +security-reviewer sonnet agents/security-reviewer.md cache-analyzer inherit .claude-plugin/agents/cache-analyzer.md ───────────────────────────────────────────────────────── ```