Building agents with code.
README.md

Tripwire (smoke) #

Runs demos at scenarios/<scenario>/<framework>/index.* with cwd sdks/<framework>/.

Contract #

AGENT_LAB_RESULT {"v":1,"scenario":"<id>","ok":true,"checks":{…}}
AGENT_LAB_SKIP {"v":1,"scenario":"<id>","reason":"missing_key"}

Fail closed: non-zero exit, ok:false, or exit 0 without RESULT/SKIP → FAIL.

Marker Meaning for GAPS
AGENT_LAB_RESULT + ok:true May flip cell to verified after a real PASS
AGENT_LAB_SKIP Missing keys / intentional skip — not a pass; leave linked
No marker / ok:false FAIL — do not flip

Hobby desk — avoid full-matrix burns #

run.ts TARGETS is a large scenario×SDK matrix. A bare npx tsx run.ts is refused so a hobby key cannot accidentally hit every wired cell and burn spend. The desk default is select.ts, which maps changed paths to targeted --id runs.

For an intentional full-matrix run, use the explicit --i-know acknowledgement:

npx tsx run.ts --i-know

Prefer selective filters or select.ts for normal work:

cd tripwire && npm install
npx tsx run.ts --scenario hello
npx tsx run.ts --id hello/letta/index.ts
npx tsx run.ts --playlist anthropic-cas

Affected targets from git diff (select.ts) #

Cheap local helper — no API calls. Maps changed paths → TARGET --id list:

cd tripwire
npx tsx select.ts                 # ids vs origin/main (+ working tree)
npx tsx select.ts --base HEAD~3
npx tsx select.ts --run           # print `npx tsx run.ts --id …` lines
npx tsx select.ts --json          # machine-readable

Typical desk loop (still requires keys for PASS; SKIP is fine without):

npx tsx select.ts --run | while read -r cmd; do eval "$cmd"; done

Path rules (summary):

Path change Selects
scenarios/<sc>/<fw>/… That scenario×framework TARGET(s)
scenarios/<sc>/README.md (etc.) All TARGETS for <sc>
sdks/<fw>/… All TARGETS for <fw>
shared/ No auto-expand (would be full matrix) — pick by hand
tripwire/, docs/, GAPS.md Notes only

There is no paid CI matrix in this lab. Unlock + smoke stay human-gated.

Named playlists (playlists/) #

Machine-usable selective lists — same hobby rule: never bare full matrix.

Playlist Key Invoke
unit-1-letta LETTA_API_KEY npx tsx run.ts --playlist unit-1-letta
anthropic-cas ANTHROPIC_API_KEY npx tsx run.ts --playlist anthropic-cas
openai-agents OPENAI_API_KEY npx tsx run.ts --playlist openai-agents

Print ordered ids (no API):

npx tsx select.ts --playlist anthropic-cas
npx tsx select.ts --playlist anthropic-cas --run   # → npx tsx run.ts --playlist anthropic-cas

unit-1-letta order: Phase-1 hello → tool-use → streaming → memory → approvals, then spine reply-obligation → support (Unit-1 done), then optional citation-grounding. Soft-pedal Managed (omitted). OA/CAS linked cells are compare-after-Unit-1 — not in this playlist.

anthropic-cas order: CAS Phase-1 hello → tool-use, then spine reply-obligation + support + citation-grounding, then Phase-2 mcp + skills + sandbox-files. Soft-pedal Managed (omitted). Optional Phase-1 follow-ons (streaming / memory / handoffs / approvals) are listed in the JSON only — not auto-run.

GAPS: SKIP without key → leave linked. Flip to verified only after each real PASS (not during playlist prep).

Model pins (reminder) #

Priority stacks pin hobby ids explicitly (see scenarios/GAPS.md + docs/FRESHNESS-AUDIT-2026-10-01.md):

  • OpenAI Agents: gpt-6-luna
  • Claude Agent SDK / Managed: claude-haiku-4-5
  • Skip Opus / Fable on hobby

Raw / langchain / Eve debt called out in the freshness audit — do not inherit spendy SDK defaults when filling new demos.