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.