Technical Deep Dive

Team Tracking Bundle

Recipe Engineering at Scale: Patterns for Reliable Bulk Processing

Currently Disabled

February 2026 ยท Two bundles ยท 19 recipes

The Mission

Bulk Session Analysis

Goal: Process hundreds of Amplifier sessions to understand team workflows, capabilities, and project patterns.

The Challenge: Build a recipe system that could reliably analyze sessions at scale — without crashing on missing files, choking on large transcripts, or hammering API rate limits.

Current status: The team tracking system is disabled (enabled: false in config since Jan 30, 2026). The engineering patterns discovered during development remain valuable regardless of deployment status.

The Ecosystem

Two Bundles, One Goal

๐Ÿ“ฆ
marklicata/amplifier-bundle-team-tracking
Session sync, bulk analysis, dashboards, and research pipeline recipes. 12 recipe files (~5,034 lines of YAML). Version 2.0 with smart sampling.

Author: Mark Licata (sole contributor)

๐Ÿ”ง
microsoft-amplifier/amplifier-bundle-made-support
Support intake, story submissions, and team-status auto-update hook. 7 recipe files (~990 lines of YAML). Version 1.3.

Primary author: Salil Das (~95% of 61 commits)

Problem #1

Recipe Crashes on Missing Files

The sync-session recipe would crash when sessions lacked events.jsonl files.

โŒ What We Expected
Conditionals protect against missing data. If a file doesn't exist, the conditional skips that step.
โœ“ What Actually Happens
The template engine evaluates ALL variables first, then checks conditionals. Missing files cause crashes before conditionals even run.
# Template evaluates $EVENTS even if conditional would skip it EVENTS=$(cat ${SESSION_DIR}/events.jsonl) # โ† Variable resolved BEFORE the "if exists" check runs # โ† Empty $EVENTS โ†’ recipe crashes
The Solution

The "Option A" Pattern

Key insight: Move conditionals inside bash commands, not in recipe logic.

# โœ“ Option A: Conditional inside bash if [ -f "${SESSION_DIR}/events.jsonl" ]; then cat "${SESSION_DIR}/events.jsonl" else echo "" # Always return output fi # Result: No crashes. Every step returns output, even if empty.

Golden Rule: All recipe steps must always produce output, even if it's an empty string. The bash layer handles file existence; the recipe layer handles data flow.

Problem #2

Death by API Calls

Original Approach

Multiple GitHub API calls per session

  • Fetch session metadata via API
  • Download events.jsonl
  • Download transcript
  • Parse, analyze, repeat

Result: Slow for large batches. Rate-limited by GitHub.

Optimized: Local-First

Direct filesystem reads from ~/.amplifier/sessions/

  • Read local session files directly
  • Zero API calls for analysis
  • Parse directly from disk
  • Batch commits to reduce API usage by ~85%

Result: Significantly faster. No rate limiting.

Problem #3

ARG_MAX and Large Files

Large transcripts (580KB+) exceeded shell argument limits when passed as command-line arguments.

Before

Passing data via arguments

curl -X POST --data "$TRANSCRIPT"

โŒ Fails on files >128KB (ARG_MAX limit)

After

Piping via stdin

echo "$TRANSCRIPT" | curl --data-binary @-

โœ“ Handles 580KB+ files reliably

Lesson: In recipe bash steps, always pipe large data through stdin rather than passing as shell arguments.

Architecture

19 Recipes Across 4 Categories

โšก
Automatic (via hooks)
sync-session, analyze-session — run on session end. Upload files, extract capabilities, update indexes in real-time.
๐Ÿ”„
Catchup (manual)
bulk-analyze-sessions, bulk-sync, find-unsynced-sessions — batch recovery when automatic sync has gaps.
๐Ÿ“Š
Reporting
team-dashboard, all-teams-dashboard, person-metrics, team-metrics — HTML dashboards from indexed session data.
๐Ÿ”ฌ
Research Pipeline
detect-research-adoption, promote-research-tool — identify experimental tools ready for productization.
Development Velocity

Built Across Two Repos

2
Repositories
61+
Commits (made-support)
19
Recipe files
~6k
Lines of YAML

Primary contributors: Mark Licata (team-tracking bundle, sole author) ยท Salil Das (~95% of made-support, 58 of 61 commits) ยท Samuel Lee (2 commits) ยท Sam Schillace (1 commit)

Sources

Research Methodology

Data as of: February 20, 2026

Feature status: Disabled (enabled: false in ~/.amplifier/team-tracking.yaml)

Research performed:

Gaps & corrections from original deck:

Note: The marklicata bundle is a shallow clone (1 commit visible). Commit count reflects made-support only.

Key Takeaways

Recipe Engineering Patterns

1. Template Variables Evaluate First
Don't rely on recipe conditionals to protect against missing data. Variables are resolved before conditionals run.
2. Use the "Option A" Pattern
Move conditionals inside bash commands. Ensure every step returns output, even if empty.
3. Pipe Large Files via Stdin
Use echo "$VAR" | curl --data-binary @- to avoid ARG_MAX limits on 580KB+ transcripts.
4. Optimize for Local-First
For bulk operations, prefer filesystem reads over API calls. Batch commits reduce API usage by ~85%.
More Amplifier Stories