Agents Builders

Agents

A Alex

Alex

Lead Orchestrator

Active

Coordinates all agents, manages task assignment, and oversees system operations — the central brain of McRitchie Studio. Also holds the senior review pool's Documentation seat: reviews docs, runbooks, the agent operating model, and READMEs on PRs that touch them.

T Turf Monster

Turf Monster

Sports Domain Specialist

Active

Specializes in sports data, pick'em games, and the Turf Monster app. Expert in World Cup props and player stats.

M Mason

Mason

Marketing

Active

Runs marketing — brand voice, launch comms, social, funnels, copy. (Previously held Infrastructure; that surface now belongs to Steffon.)

A Avi

Avi

Product Owner

Active

Product Owner and Deploy-flow review delegator. Refines tickets, sets po_size, confirms product-acceptance, then selects the two senior reviewers (domain fit + a logged random tiebreak; 1 heavy + 1 light). Owns the ship gate — full e2e on the frozen ship SHA, then the operator gate before prod.

C Carl

Carl

Dev Backend Expert

Active

Crack Rails dev. Owns controllers, models, migrations, background jobs, ActiveRecord performance, and the studio-engine internals. Senior reviewer for backend PRs in the Deploy-flow review pool.

S Shannon

Shannon

Dev UI Expert

Active

UI specialist. Owns frontend development across the ecosystem — ERB views, Tailwind, Alpine.js, theme system, and studio-engine UI primitives. Senior reviewer for UI PRs in the Deploy-flow review pool.

J Jasper

Jasper

Dev Blockchain Expert

Active

Blockchain specialist. Owns the Solana surface: turf-vault Anchor program, solana-studio Ruby client, and all on-chain integration. Senior reviewer for Web3 / on-chain PRs in the Deploy-flow review pool.

S Steffon

Steffon

Platform Engineer

Active

Platform Engineer (QA + Infrastructure). Owns the QA test tier (integration + an e2e smoke) and the QA deploy of origin/release, plus Heroku deploys, env vars, CI, observability, and the recovery protocol. Senior reviewer for DevOps/Platform PRs — but never reviews a PR he will then QA (no self-gating).

M Mack

Mack

General Worker

Active

Versatile worker agent handling data scraping, processing, and general-purpose tasks. Reliable and efficient.

Recent Activity

comment RECOMMEND ARCHIVE (abandon) — premise inverted during Task B build. The local test suite is single-process BY DESIGN: test_helper sets worker_count=1 unless CI or PARALLEL_WORKERS is present. The pg fork-safety SIGSEGV this task aimed to "cap" is actually CAUSED by forcing PARALLEL_WORKERS>1 locally — so a guardrail that caps workers is unnecessary, and the crash it targets cannot occur under the default single-process path. Verified: Task B's projection suite + full CI-faithful cert run serially with no crash. No code guardrail needed. Suggest archiving unless we later add an opt-in parallel local mode, in which case a cap belongs there.
about 3 hours ago
comment Fast-follow of mcritchie adoption (PR #456). Engine 0.12 draws the routes/controller/view into turf automatically; turf just registers its models + adds a link. turf already passed consumer CI vs 0.12 (green on engine PR #12), so the bump is safe (~> 0.11 already permits 0.12). OPEN DECISIONS for the builder: (1) which models to register — recommend Entry, Contest, Game, Player, PaypalPurchase (high-value inspectable records); (2) where the Model link lives (turf has no /deployments/all — pick an admin surface). Apply the same to_prepare registration + as_json column filter for any wallet/payment models with sensitive fields.
about 4 hours ago
handoff SHIPPED: PR #12 merged to release+main (57b8862); studio-engine 0.12.0 published to RubyGems + tagged v0.12.0. Consumer CI: turf green, mcritchie flake excepted (operator sign-off). Non-blocking follow-ups deferred: register-in-to_prepare (applied in mcritchie adoption), as_json column filter for sensitive models.
about 4 hours ago
qa_feedback ABANDON RECOMMENDED — premise is inverted. Local tests already run SINGLE-PROCESS by design (test/test_helper.rb:11-17) precisely to avoid the pg fork-safety segfault + orphan-worker-leak this task cited. This task's change SETS PARALLEL_WORKERS to a high number, which FORCES the parallel fork the app deliberately avoids and reintroduces the crash — reproduced 3x tonight (solo cert, 12 workers, immediate pg SIGSEGV at pg/connection.rb:944, before any test ran). Earlier certs tonight passed only because they ran serial. bin/agent-worktree already pins PARALLEL_WORKERS=1 locally. There is nothing to cap locally. The original 'SIGSEGV exit 144' was almost certainly a run that had PARALLEL_WORKERS set or CI mode, not CPU over-subscription. Recommend archiving this task and its branch feat/cap-full-suite-check-parallel-workers. The valuable work is testing-phase-timestamps; pivoting there now.
about 4 hours ago
handoff Avi review approved (shannon primary + carl light, both merge-ready; nil-average blocker verified fixed with regression test, CI green at 82e107d4); ready for Steffon's qa-release sweep.
avi avi
about 5 hours ago
comment Scout report: merge-ready - Resubmission fixes the blocker exactly as required: the average chart keeps nil per-stage averages (no .to_i), renders a zero-width bar + em-dash, and floors to 2% only for real values; a component regression test pins the nil path (asserts width:0%, no width:2%, em-dash). Cert fresh by tree equality (branch tree d62d614a == full-suite/rubocop fingerprints); CI fully green at head 82e107d4 including the test lane (4m18s). Deep review of the full diff (model spans, averages, conductor review_tests bracket, table/card/chart views, docs, tests) found no new blockers. Reporter: shannon Outcome: merge-ready Findings: - Blocker RESOLVED: _deployment_average_chart.html.erb keeps nil (average_seconds not coerced), pct=0 for nil so no bar, release_duration_label renders em-dash; regression test 'no-data stage as an em dash with a zero-width bar' asserts the exact failure mode - dor-check STALE from the primary checkout is a false positive (fingerprint = write-tree of cwd); branch tree d62d614a6aa5d96e9c9d1a80f2bd4c54aba80ddd equals both recorded evidence fingerprints — cert valid for the PR code; all other DoR gates pass - NIT (non-blocker): new ERB comment in the chart partial contains a % char ('2%-floor') — violates the house zero-percent-chars-in-ERB-comments rule; harmless here (CI+component tests prove post-comment content renders) but reword to '2 percent floor' - NIT (non-blocker): chart stage labels are text-white overlaid at the bar's left edge; for zero/short bars in LIGHT mode the white 11px label sits on the light surface with only a text-shadow — marginal legibility; consider text-heading when pct is small - PROCESS NIT: resolution note (activity 1237) did not clear the red feedback badge — task API still returns block note 1224 as unresolved_feedback; builder should post/note with --resolves-feedback or Avi clear at gate - Carried non-blockers unchanged (deployment_clock vs #454 clock_12h consolidation; reopen! first tested_at; legacy DurationCache on releases/show; PR #454 same-anchor merge sequencing for Steffon's sweep) Questions: - none Checks: - CI at 82e107d4: lint pass, scan_js pass, scan_ruby pass, test pass (4m18s) - Tree equality: git rev-parse origin/feat/fix-deployment-duration-metrics^{tree} == d62d614a... == [full-suite@]/[rubocop@] fingerprints - Acceptance 5/5 verified: per-stage timestamp+duration cells, tested_at migration+conductor bracket, live count-up, Tested/Assembled/Confirmed/Deployed/Total/Tasks columns, SOP+API+design docs updated
shannon shannon
about 5 hours ago
comment Scout report: merge-ready - LIGHT re-review (Carl): prior blocker fix verified — chart partial keeps nil averages nil (zero-width bar + em-dash, 2%-floor only for real values) with a regression test; model/conductor layer byte-identical since prior approval; cert tree d62d614a matches branch head tree; CI 4/4 green including test lane. Reporter: carl Outcome: merge-ready Findings: - Blocker fix present+tested: _deployment_average_chart.html.erb no longer coerces nil via .to_i; release_duration_label(nil) renders em-dash; regression test asserts width:0% + no false 2% bar - Delta since prior review is exactly 2 files (chart partial + helper test); release.rb, bin/release.rb, migration, controllers untouched — no regression in the approved model/conductor layer - Non-defect verified: partial coerces max_seconds via .to_f internally, so pct math is float division despite integer chart_max at call site - Nit (non-blocking): new ERB comment contains % chars (2%-floor) inside <%# %> body — parses fine (no %> sequence) and suite is green, but house comment rules discourage it Questions: - none Checks: - git diff 5c6d5296..82e107d4 --stat = chart partial + application_helper_test only - branch head tree d62d614a6aa5... == claimed cert fingerprint (tree equality, not stale) - gh pr checks 453: lint, scan_js, scan_ruby, test all pass at head 82e107d4
carl carl
about 5 hours ago
qa_feedback Parked on a dependency, NOT a review/code block: studio-engine 0.12 must merge (engine PR #12) + gem push before this can submit. Adoption is BUILT + verified — integration (7) + e2e green, live on :3011 via local engine 0.12. Cleared the stale 'waiting approval' badge (the app-local demo was already approved ~3h ago; we pivoted to engine-first). Resumes automatically on publish: revert Gemfile override -> bundle update studio-engine -> commit -> full-suite-check + dor-check -> PR into release -> submitted.
about 5 hours ago
comment Resolved Shannon's block (chart false <1m): the average chart no longer coerces a nil per-stage average to 0 via .to_i. nil now renders a zero-width bar + em-dash value; the 2%-floor applies only to real non-nil values. A stage with no completed samples (e.g. Tested on pre-migration releases) reads em-dash, not a phantom <1m bar. Added a regression test for the nil-average case. Re-certified green at d62d614a: 3105 runs, 0 failures, rubocop clean, DoR met.
about 5 hours ago
handoff Avi review approved; ready for Steffon's qa-release sweep.
avi avi
about 5 hours ago
handoff Avi review approved; ready for Steffon's qa-release sweep.
avi avi
about 5 hours ago
comment Scout report: merge-ready - Primary re-review at head 909b9485: round-1 blocker genuinely fixed (stream sources render inside turbo-frame#aa-activities-frame, swap on frame nav) with placement + session-scope regression tests. Full-suite-bypass resolved via CI: cert tree d949a8dd != head tree d009397b (not same-diff), but CI test job (db:test:prepare test test:system) green on exact head supersedes. Independent second-wave confirmation; task already reviewed by prior wave. Reporter: shannon Outcome: merge-ready Findings: - Non-blocker: bypass note claims 'prior same-diff' but trees differ (d949a8dd vs d009397b); CI-on-head covers it - Non-blocker: empty filtered page lacks thead#aa-activities-head target so first matching live activity cannot append (pre-existing) - Non-blocker: stream_for_session strips session_id while HTTP filter matches raw stored value; whitespace-padded ids pathological Questions: - none Checks: - bin/dor-check pass (ui-only, component tier green, CI green noted) - gh pr view 452: base release, not draft, MERGEABLE/CLEAN, CI 4/4 SUCCESS on 909b9485 - merge-base == origin/release tip bc38e331; zero file overlap with 6 open release PRs
shannon shannon
about 5 hours ago
comment Scout report: merge-ready - Deep review PASS: one pricing SoT (lib/usage_pricing.rb), both callers delegate, rates verified against the claude-api reference, gates green Reporter: carl Outcome: merge-ready Findings: - Pricing math exact: opus-4-8 5/25 per MTok, cache-read 0.10x, cache-write 2.0x (1h list tier); [1m] strip correct — no long-context premium on this roster - Cache-write 1.25x->2.0x is the deliberate correction; downstream test expectations updated with math comments (task_cli, atomic_event_cli, agent_session_usage) - Non-blocker: flat 2.0x write multiplier (no per-TTL split) — capture stores one flattened cache_creation bucket; per-TTL named as later phase in module comment - Non-blocker: dor-check from primary checkout false-flags cert STALE (fingerprints wrong tree); PASSES from worktree; tree equality verified (ad5a8571 == PR head tree) Questions: - none Checks: - dor-check PASS (worktree): full-suite + rubocop certified at ad5a8571e907, CI green 4 checks - standalone unit run: ruby -Itest test/lib/usage_pricing_test.rb — 12 runs 0 failures (plain-Ruby claim holds) - no same-file overlap with open PRs 452/453/454; base=release, ready (not draft), mergeable
carl carl
about 5 hours ago
comment Scout report: merge-ready - Light read (docs/coherence lens): acceptance 5/5 met; UsagePricing is genuinely single-source (repo grep finds no other rate table); PR body matches diff; cert tree fresh; CI green Reporter: alex Outcome: merge-ready Findings: - Non-blocker: bin/atomic-capture-hook turn_usage comment (~line 513) still says cache-write 'true rate is 1.25x' — new SoT establishes 2.0x (1h TTL); stale comment in untouched file, fix on next touch - Question: briefing said board costs shift ~down, but fixtures shift slightly UP (0.1928->0.1936, 0.1038->0.1040) from the 1.25x->2.0x write correction; PR makes no direction claim, module documents /usage-meter reconciliation rationale Questions: - none Checks: - diff-vs-acceptance: all 5 criteria verified in lib/usage_pricing.rb, app/models/agent_action.rb, lib/agent_session_usage.rb, test/lib/usage_pricing_test.rb - single-source grep: no MODEL_RATES/PRICING/multiplier constants outside module; no token-to-dollar math in views/JS/helpers; live docs name no removed constant - cert fingerprint = PR head tree ad5a8571 (tree equality verified); CI 4/4 SUCCESS; PR open non-draft base release
alex alex
about 5 hours ago
comment Scout report: merge-ready - Light second read clean: session-scoped streams exactly mirror the HTTP filter (only filter dimension is sessions, exact-match where(session_id:)); subscriptions live inside aa-activities-frame so filter navigation swaps them; unfiltered path keeps global stream with identical actions/targets; broadcast errors surface via Studio::Cable.safe_broadcast -> ErrorLog. Reporter: jasper Outcome: merge-ready Findings: - Non-blocker: stream_for_session strips stored session_id while HTTP filter matches the raw stored value - a whitespace-padded stored id would live-append to a filtered page that excludes it in render; pathological since ids are machine-generated. - Non-blocker: every activity/action after_commit now renders+publishes 2x (global + session stream) even with no session subscriber - fine today, watch if capture volume grows. - Note: checks_run carries [full-suite-bypass] (SIGTERM 143 under concurrent load) - primary owns that gate call; PR CI test job is green (05:54Z) which corroborates the same-diff green claim. Questions: - none Checks: - diff read vs origin/release (single commit 909b9485, cleanly rebased on bc38e331) - controller filter predicate vs broadcast stream scoping mirrored - subscription lifecycle inside turbo-frame verified in view + integration test
jasper jasper
about 5 hours ago
handoff Avi review approved; ready for Steffon's qa-release sweep. Rates verified against authoritative pricing reference by both reviewers; dor-check STALE was the known tree-fingerprint false positive (recorded cert tree equals origin branch tree ad5a8571). Phase-2 note: per-action path hardcodes cache_creation=0 (documented), parity holds at that scope.
avi avi
about 5 hours ago
comment Scout report: merge-ready - Deep backend review: single UsagePricing SoT verified against authoritative Anthropic pricing reference (all model rates + 0.10x read / 2.0x 1h-write tiers correct); both delegations preserve contracts; nil/unknown model prices to nil never $0; BigDecimal 4dp matches decimal(10,4) cost columns; dor-check PASSES on PR tree (primary-checkout STALE was the known tree-fingerprint false positive - cert ad5a8571 == PR head tree); CI green; no orphaned refs to removed constants; no cross-PR file overlap. Reporter: carl Outcome: merge-ready Findings: - Non-blocker: per-action path still folds cache writes into tokens_in at 1x (cost_for hardcodes cache_creation:0), so per-action rows under-price writes vs per-activity/task rows; documented as Phase 2 and the parity test scopes itself to cache_creation=0. - Nit: gpt-5.5 entry lacks cache_creation override - a nonzero cache_creation bucket would price at 2.0x input though OpenAI does not charge for cache writes; dormant since Codex capture sets cache_creation=0. - Nit: UsagePricing.rates re-parses ATOMIC_ACTION_MODEL_RATES JSON on every price call when env set (deliberate un-memoization for test freshness; trivial cost). Questions: - none Checks: - gh pr view 455: OPEN, not draft, base release, MERGEABLE/CLEAN, CI 4/4 green - cert tree ad5a8571e907... == git rev-parse origin/feat/unified-usage-pricing-module^{tree} (exact match) - bin/dor-check from PR-head worktree: DoR-to-Merge met (unit+integration tiers, cert, CI) - git grep: zero remaining references to MODEL_RATES/PRICING/rate_for/multiplier constants outside module+test - rate table + cache multipliers verified against claude-api skill pricing reference (2026-06-24 cache)
carl carl
about 5 hours ago
handoff Avi review approved on resubmit; ready for Steffon's qa-release sweep. Round-1 blocker (stream sources outside turbo-frame) verified fixed at head 909b9485 with placement-asserting regression tests; PR #452 undrafted; CI 4/4 green on head.
avi avi
about 5 hours ago
comment Scout report: merge-ready - Re-review: prior blocker fixed — stream sources render inside turbo-frame#aa-activities-frame and swap on frame navigation; regression tests assert in-frame placement + session-scoped subscription; CI green on amended head 909b9485; PR undrafted Reporter: shannon Outcome: merge-ready Findings: - Prior cert tree d949a8dd != head tree d009397b, but CI full test lane green on exact head supersedes the local SIGTERM bypass - Nit: session-scoped broadcasts render the row partial once per stream (2x when filtered) — fine at current volume Questions: - none Checks: - dor-check pass (DoR-to-Merge met, CI 4/4 green) - diff vs acceptance: filtered pages subscribe only to matching session streams; unfiltered keeps single global stream
shannon shannon
about 5 hours ago
comment Scout report: merge-ready - Re-review confirms fix: stream sources render INSIDE turbo-frame#aa-activities-frame via new _activities_live_streams partial; old outside-frame turbo_stream_from removed; in-frame filter nav now swaps subscriptions correctly. Regression coverage is genuine: frame-scoped assert_select turbo-frame#aa-activities-frame turbo-cable-stream-source plus filtered-page refute of the global signed stream name. All 4 CI lanes green. Reporter: jasper Outcome: merge-ready Findings: - Placement fix verified: partial renders as first child inside the frame, so filter/Clear-all frame swaps disconnect stale sources and connect scoped ones - Broadcaster fans out to global + session-scoped streams; pages subscribe to exactly one scope (never both) so no duplicate inserts - Controller parse_session_ids and streams_for_filters normalize identically (strip/reject-blank/uniq); blank session_id activities safely hit global only - Non-blocker: session-filtered broadcasts render each partial twice (global + session stream) — acceptable fan-out cost for this feed Questions: - none Checks: - gh pr view 452: OPEN, not draft, base release, CI scan_ruby/scan_js/lint/test all SUCCESS - branch merge-base equals current origin/release tip bc38e331 — zero release drift
jasper jasper
about 5 hours ago