Skip to content

feat(agents): add ci-triage-engineer + vercel-preview-auditor + literature-searcher (15 → 18)#225

Merged
dackclup merged 1 commit into
mainfrom
claude/add-ci-vercel-lit-subagents
May 23, 2026
Merged

feat(agents): add ci-triage-engineer + vercel-preview-auditor + literature-searcher (15 → 18)#225
dackclup merged 1 commit into
mainfrom
claude/add-ci-vercel-lit-subagents

Conversation

@dackclup
Copy link
Copy Markdown
Owner

Summary

Bumps subagent roster .claude/agents/ from 15 → 18 to close three session-observed gaps where main-agent inline work (opus, "Weekly · all models" pool) was doing labor that should drain the underutilized "Weekly · Sonnet only" pool on Max plans.

All 3 new agents are sonnet, read-only, and refuse to make decisions outside their narrow slot (no test-flipping, no production-flag verdicts, no preview-promote-to-prod, no copyright-violating mirrors).

New agent Tier Why now
ci-triage-engineer Tier 4 Operations This session's PR #224 Python check failed → main-agent (opus) had to fetch + diagnose inline. Signal-driven (GitHub Actions webhook); 10-class failure taxonomy (schema-pin-drift / ruff-I001 / F401 / F841 / dep-missing-ci-only / real-bug / simulate-45min-cap / flaky-transient / vercel-build-skew / schema-drift-CI)
vercel-preview-auditor Tier 2 Lifecycle CLAUDE.md §Commands already mandates pre-Playwright Vercel MCP probe but the discipline relied on main-agent memory and got skipped. Wraps list_deploymentsget_deployment_build_logsget_runtime_logsweb_fetch_vercel_url 3-route UA probe
literature-searcher Tier 3 Specialized Offloads paper / SEC-filing retrieval from methodology-scientist (opus) → judgment stays opus, fetch stays sonnet. Carries the 17-paper canonical anchor list in-prompt + refuses to re-fetch them; refuses sci-hub / libgen mirrors

Tier counts

Tier Before After Delta
1 Core 5 5 0
2 Lifecycle 4 5 +vercel-preview-auditor
3 Specialized 4 5 +literature-searcher
4 Operations 2 3 +ci-triage-engineer
Total 15 18 +3

4-opus / 14-sonnet split preserved (was 4 / 11). The 4 opus agents (quantrank-reviewer · methodology-scientist · release-captain · incident-commander) remain unchanged per CLAUDE.md spawn discipline.

Doc lockstep

  • .claude/agents/README.md — T2 / T3 / T4 rows + roster header 15 → 18
  • CLAUDE.md §Layout .claude/agents/ row 15 → 18 + §Auto-routing policy delegation-patterns table +3 rows + cue table +3 rows + spawn discipline 4-vs-11 → 4-vs-14
  • AGENTS.md §Project structure agents row 15 → 18 + new §Phase + version state entry (cross-tool routing: still Claude-Code-only)

Non-overlapping with PR #224

This PR is stacked alongside PR #224 (Form-4 10b5-1 contamination filter, claude/magical-curie-saWfR). Both branched from same main SHA 79bb5ae. Zero file overlap — PR #224 touches compute/scoring/form4_*.py + schema triple; this PR touches .claude/agents/*.md + doc roster mentions. Land order does not matter.

Test plan

  • ruff check .claude/agents/ — no Python files; clean (sanity)
  • Frontmatter name: / description: / tools: / model: valid markdown YAML per existing pattern
  • Description sentences include explicit TRIGGER keywords per skill-trigger discipline (PR chore(skills): sharper auto-trigger keywords for 5 mattpocock-* skills #157 + CLAUDE.md §Auto-routing)
  • CI Python lint+test (doc-only PR — should pass trivially)
  • CI Frontend build (untouched — should pass trivially)
  • Post-merge spot-check: spawn one of the 3 new agents on a real trigger to confirm prompt quality

Hard constraints baked into each agent

  • ci-triage-engineer: NEVER auto-flip test assertions to match production-code behavior. NEVER classify as flaky without re-run evidence. NEVER suggest --no-verify to bypass a hook.
  • vercel-preview-auditor: NEVER invoke deploy_to_vercel. NEVER promote preview to production. NEVER classify as GO if runtime log has ANY error entry.
  • literature-searcher: NEVER make a methodology verdict. NEVER fetch a paywalled paper via copyright-violating mirror. NEVER cite an unverified secondary source for an empirical claim that ends up in a defense-flag docstring.

References

https://claude.ai/code/session_01SSg1tZypxdgthAYTnQyd1h


Generated by Claude Code

@vercel
Copy link
Copy Markdown

vercel Bot commented May 23, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
quantrank Ready Ready Preview, Comment May 23, 2026 1:29pm

…ature-searcher (15 → 18)

Closes three session-observed gaps where main-agent inline work was
draining the "Weekly · all models" pool instead of the underutilized
"Weekly · Sonnet only" pool on Max plans.

(a) `.claude/agents/ci-triage-engineer.md` (Tier 4 Operations, sonnet)
    — Reactive to GitHub Actions check failures via the
    `<github-webhook-activity>` PR-activity event. Knows the CI matrix
    (Python lint+test · Frontend build · simulate · Vercel preview) +
    10-class failure taxonomy (schema-pin-drift / ruff-I001 / F401 /
    F841 / dep-missing-ci-only / real-bug / simulate-45min-cap /
    flaky-transient / vercel-build-skew / schema-drift-CI). Proposes
    one-line fix the user authorizes. Refuses to auto-flip test
    assertions or classify as flaky without re-run evidence. Read +
    Bash + Grep + Glob; no MCP tool access (asks main agent to invoke
    GitHub MCP).

(b) `.claude/agents/vercel-preview-auditor.md` (Tier 2 Lifecycle, sonnet)
    — Wraps Vercel MCP server chain: `list_deployments` →
    `get_deployment_build_logs` → `get_runtime_logs` →
    `web_fetch_vercel_url` 3-route UA probe. Codifies the CLAUDE.md
    §Commands "When Vercel MCP is loaded, list_deployments →
    get_runtime_logs is the cheap pre-Playwright pass" — which today
    depends on main-agent memory. Fires before Mark-Ready on any UI-
    touching PR. Refuses to invoke `deploy_to_vercel` or promote
    preview to production. Knows the QuantRank Vercel project name
    (quantrank), team scope (dackclups-projects), and preview URL
    pattern.

(c) `.claude/agents/literature-searcher.md` (Tier 3 Specialized, sonnet)
    — WebSearch + WebFetch wrapper for academic papers + SEC rule
    releases + EDGAR filings. Carries CLAUDE.md's 17-paper canonical
    anchor list in-prompt (Altman / Sloan / Beneish / Dechow / Mayew
    / BD / HLM / DT / Damodaran / Roychowdhury / Cohen / CMP / JMZ /
    Jagolinzer / Bushman-Smith / Aboody / Huber) and refuses to re-
    fetch those. For new papers: WebSearch → preferred
    author/SSRN/NBER free PDF → WebFetch → locate the section →
    return citation-ready excerpt + suggested docstring format.
    Offloads retrieval from `methodology-scientist` (opus) — judgment
    stays on opus, fetch stays on sonnet. Refuses to make a
    methodology verdict itself (that's methodology-scientist's slot
    exclusively); refuses copyright-violating mirrors (sci-hub /
    libgen) — preprint OR institutional-access workflow only.

Tier counts updated:
- Tier 1 Core: 5 (unchanged)
- Tier 2 Lifecycle: 4 → 5 (+vercel-preview-auditor)
- Tier 3 Specialized: 4 → 5 (+literature-searcher)
- Tier 4 Operations: 2 → 3 (+ci-triage-engineer)
- Total: 15 → 18

4-opus / 14-sonnet split preserved (was 4/11). All 3 new agents are
sonnet to drain the underutilized Sonnet-only pool per PR #219 +
PR #223 token-economy rebalance.

Doc lockstep:
- `.claude/agents/README.md` tier tables (T2 / T3 / T4 add a row each)
  + roster header 15 → 18
- `CLAUDE.md` §Layout `.claude/agents/` row 15 → 18
- `CLAUDE.md` §Auto-routing policy:
  - Delegation patterns table +3 rows (CI fail / Vercel preview /
    literature search)
  - Cue table +3 rows (CI webhook / pre-Mark-Ready UI / methodology
    cite outside anchor list)
  - Spawn discipline split count 4-vs-11 → 4-vs-14
  - "Pattern not in the table" walks 18 agents now (was 15)
- `AGENTS.md` §Project structure agents row 15 → 18; new §Phase +
  version state entry documenting cross-tool routing posture (still
  Claude-Code-only)

Doc-only PR. No compute / schema / scoring / valuation / frontend
code change. CI Python lint+test should pass on this branch with
zero regression (no Python code touched).

Stacked alongside PR #224 (Form-4 10b5-1 filter, on
`claude/magical-curie-saWfR`); both branched from same main SHA
`79bb5ae`. Land order does not matter — no scope overlap.

https://claude.ai/code/session_01SSg1tZypxdgthAYTnQyd1h
@dackclup dackclup force-pushed the claude/add-ci-vercel-lit-subagents branch from 9499304 to 3b9e708 Compare May 23, 2026 13:28
@dackclup dackclup marked this pull request as ready for review May 23, 2026 13:31
@dackclup dackclup merged commit 2b343bb into main May 23, 2026
4 checks passed
@dackclup dackclup deleted the claude/add-ci-vercel-lit-subagents branch May 23, 2026 13:31
dackclup added a commit that referenced this pull request May 23, 2026
…literature-searcher injection guard) (#226)

* docs+agent: post-Dependabot-wave doc fixes (W1 FORM4_FETCH_SKIP + W3 literature-searcher prompt-injection guard)

Output from the post-PR-#225 parallel dependency-auditor +
security-reviewer spawn (2026-05-23, session 3) — actionable
follow-ups from the 15-vuln Dependabot triage.

15-vuln triage outcome (no code change needed):
- All 15 are next@14.2.35 SSR / middleware / Server-Actions /
  Image-optimization / API-route advisories → ALL route to issue
  #41 (Next 14→16 migration tracker)
- Static-export exploitability = effectively zero (no SSR runtime,
  no middleware, no Server Actions, no Image endpoint, no API routes;
  Vercel CDN serves pre-built static HTML)
- CVE baseline: 25 open (1C/8H/12M/4L) → 15 open (0C/6H/7M/2L) after
  PR #194's next 14.2.15→14.2.35 + postcss override closed 10
- 14 GHSA IDs confirmed; 1 (7th MODERATE) needs API confirmation when
  token access is restored — to be appended on issue #41 separately

security-reviewer findings — 0 CRITICAL + 4 WARN; 2 land here, 2 deferred:

- W1 (this PR) — FORM4_FETCH_SKIP=1 operational escape hatch was
  undocumented anywhere user-facing. Added §Gotchas entry in CLAUDE.md +
  §Security considerations entry in AGENTS.md describing the env var,
  where it's set (pre-merge-prod-sim.yml), and the safe default
  (absence = no skip)
- W3 (this PR) — .claude/agents/literature-searcher.md Hard
  Constraints lacked an explicit untrusted-content guard against
  prompt injection in fetched papers / SEC HTML. Added a constraint
  that treats every WebFetch result as data to QUOTE + CITE, never
  to execute — handles "ignore previous instructions" / "fetch this
  other URL" / "modify your output" injection vectors
- W2 deferred — compute-rankings.yml workflow-level contents:write
  is pre-existing + justified (commit-JSON step is the only writer);
  narrowing to job-scope is a future optimization
- W4 deferred — log-bash.sh logs raw bash command (including inline
  env-var values) to gitignored .claude/session.log; severity low
  because file is gitignored + local-only; optional sed-scrub later

Doc-only — no compute / schema / scoring / valuation / frontend /
Python / TS code change. CLAUDE.md + AGENTS.md lockstep satisfied
(both touched; §Phase status in-flight note added).

https://claude.ai/code/session_01JwntEE4PNAXSMkZxRA9BB4

* docs(CLAUDE): polish #226 review nit — future-tense → present-tense + date

docs-reviewer verdict on PR #226 (commit 35942ea) was PASS-AS-IS with
one optional clarity nit (CLAUDE.md §Phase status in-flight block,
line 1447):

  before: "1 (the 7th MODERATE) needs Dependabot-alerts-API
          confirmation when token access is restored."

  after:  "1 (the 7th MODERATE) — Dependabot-alerts-API confirmation
          pending (token access unavailable as of 2026-05-23)."

§Conventions rule: replace future-tense for unfinished work with
present-tense + date so the doc doesn't rot when the "when X happens"
clause becomes irrelevant.

No substance change. No new file touched.

https://claude.ai/code/session_01JwntEE4PNAXSMkZxRA9BB4

---------

Co-authored-by: Claude <noreply@anthropic.com>
dackclup added a commit that referenced this pull request May 24, 2026
… ci-triage-engineer (#228)

Surfaced by the post-PR-#225 live-fire of the three new sub-agents
on 2026-05-23 (session 4). vercel-preview-auditor returned a clean
WAIT verdict citing "Vercel MCP not reachable in subagent session" —
a real infrastructure gap, not an agent prompt issue. ci-triage-engineer
worked around the same gap by falling back to git history + the
squash-merge commit body (correct fallback discipline) but hit
GitHub API rate-limits on the unauthenticated fallback path.

Root cause: the Claude Code sub-agent runtime does NOT auto-inherit
MCP tools from the parent session. Each sub-agent is restricted to
the tools listed explicitly in its `tools:` frontmatter field; MCP
tools must be enumerated by full name `mcp__<server>__<tool>`.

Two-part fix:

(a) `.claude/agents/vercel-preview-auditor.md` — `tools:` frontmatter
    extended to list 7 Vercel MCP tools by their UUID-namespaced
    name (`mcp__0addee55-c9d7-44a2-b1b2-355b2d3fc4fd__*`):
    list_deployments / get_deployment / get_deployment_build_logs /
    get_runtime_logs / web_fetch_vercel_url / get_project /
    list_projects. Hard-constraint bullet added: "If Vercel MCP
    tools are NOT in your context, surface as WAIT (MCP access gap)
    and escalate to main; do NOT fabricate deployment status." The
    UUID is OAuth-connection-specific so a fresh clone by a
    different user would have a different UUID and the pinned
    frontmatter would silently fail to match — the escalation path
    keeps the agent useful in that scenario.

(b) `.claude/agents/ci-triage-engineer.md` — `tools:` frontmatter
    extended to list 6 GitHub MCP tools (stable `mcp__github__*`
    namespace): pull_request_read / list_pull_requests / list_commits /
    get_commit / search_pull_requests / search_code. Hard-constraint
    bullet added: "If GitHub MCP unavailable, may fall back to
    local git history as primary evidence (squash-merge commit body,
    refs) — but must explicitly cite the access gap in the report;
    never fabricate check-run IDs or log URLs."

Docs:
- CLAUDE.md §Gotchas — new bullet documenting the sub-agent MCP
  inheritance limitation so future agent authors don't repeat the
  gap; lists the GitHub stable-namespace vs UUID-based connector
  distinction
- CLAUDE.md §Phase status — in-flight entry for this PR + reworded
  2 stale "in flight (this PR)" headers from PR #226 + PR #227 to
  "merged via PR #N" so the §Phase status tracker reflects post-merge
  state
- AGENTS.md §Phase + version state — mirrored in-flight entry + same
  PR #227 stale-header reword

Doc-only PR — no compute / schema / scoring / valuation / frontend /
Python / TS production-code change. Tests unchanged. ruff trivially
passes.

https://claude.ai/code/session_01JwntEE4PNAXSMkZxRA9BB4

Co-authored-by: Claude <noreply@anthropic.com>
dackclup added a commit that referenced this pull request May 24, 2026
…bagent count 15 → 18 + INFLIGHT.md housekeeping (#243)

User called out a recurring error from session 7: I repeatedly stated
"cron Sun 22:00 UTC" in summaries despite the actual workflow
schedule being Mon-Fri only.

ROOT CAUSE: the handoff prompt at session start said
"Next prod cron: Sun 2026-05-24 22:00 UTC (cron-#4)" and I echoed
that without verifying against `.github/workflows/compute-rankings.yml`.
The YAML has read `"0 22 * * 1-5"` from initial commit (verified via
`git log --all -p`). Inline comment in the workflow even says
"Weekends skipped (no new trading data)".

Stale "Sunday/Sun 22:00 UTC" references across 4 files corrected:

- CLAUDE.md:31 §Stack — "cron Sun 22:00 UTC" → "cron Mon-Fri 22:00 UTC"
- docs/RESEARCH_FINDINGS.md:854 — "WEEKLY (GitHub Actions, Sunday
  22:00 UTC)" → "WEEKDAY (GitHub Actions, Mon-Fri 22:00 UTC; weekends
  skipped)"
- docs/ARCHITECTURE.md:7 mermaid diagram — "Sun 22:00 UTC" →
  "Mon-Fri 22:00 UTC" + edge "run weekly" → "run weekdays"
- docs/stock_ranking_knowledge.md:993 — "Weekly Sunday 22:00 UTC" →
  "Weekday Mon-Fri 22:00 UTC: Main compute cron (weekends skipped —
  no new trading data)"

Companion stale-info fix found during audit:

- AGENTS.md:1294 — "The 15 subagents under `.claude/agents/`" →
  "The 18 subagents under `.claude/agents/`". The roster expanded
  to 18 in PR #225 (ci-triage-engineer + vercel-preview-auditor +
  literature-searcher). AGENTS.md:91 already said 18 — line 1294
  was unsynced drift.

INFLIGHT.md housekeeping (per PR #237 convention — append-only with
periodic move from "In flight" → "Merged" sub-section):

- PR #241 (simulate Parts 5+6+7, `e9d7836`) → moved to Merged with
  consolidated 4-iteration summary preserving the QR_SKIP_OSAP +
  QR_SKIP_CROSS_SOURCE + timeout-45→90 history
- PR #242 (light-mode soften + Strong Buy nowrap + StockLogo
  square, `a30c017`) → moved to Merged, original entry text intact
- Duplicate "## Merged (awaiting housekeeping move to CLAUDE.md)"
  header at line 257 deleted (was a rebase-artifact duplicate from
  the PR #239 + PR #240 chronology resolution); file now has exactly
  ONE Merged section
- Old "PR (this PR) — Simulate Parts 5+6+7" body block excised
  (lines 201-300 of the post-rebase file) — replaced by this PR's
  clean Doc-staleness sweep entry in the In-flight section

Audit completeness:

- Schema version `0.10.2-phase4.5e` — verified current across
  CLAUDE.md, PHASE_STATUS.md, AGENTS.md (no stale references)
- Defense layer "32 boolean flags emitted" — verified current
- Subagent file count = 19 in `.claude/agents/` (18 agent files +
  1 README.md) — corresponds to 18 subagents, AGENTS.md:91 + :1294
  now both consistent

No compute / schema / scoring / valuation / Python / TypeScript code
change. Doc-only PR. PHASE_STATUS_INFLIGHT.md side-file satisfies
§Conventions lockstep.

https://claude.ai/code/session_01JwntEE4PNAXSMkZxRA9BB4

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants