Skip to content

APPENG-6165, APPENG-6166: Gmail & Calendar read-only test cases - #1

Open
csoceanu wants to merge 3 commits into
GuyZivRH:feature/openshell-openclaw-crablinefrom
csoceanu:appeng-6165-gmail-operations
Open

APPENG-6165, APPENG-6166: Gmail & Calendar read-only test cases#1
csoceanu wants to merge 3 commits into
GuyZivRH:feature/openshell-openclaw-crablinefrom
csoceanu:appeng-6165-gmail-operations

Conversation

@csoceanu

@csoceanu csoceanu commented Aug 24, 2026

Copy link
Copy Markdown

Summary

  • APPENG-6165: 4 Gmail READ test cases (010-013), each testing one MVP requirement
  • APPENG-6166: 5 Calendar READ test cases (014-018), each testing one MVP requirement
  • New smolclaw seeding capabilities: create_labels, create_calendars, seed_to_label, threaded:false, multi-event seeding
  • Two new judges: score_gmail_read_extraction, score_calendar_read_extraction

Test Cases

Gmail (APPENG-6165)

Case MVP Requirement Seed Judge
010 list-mail-messages 3 emails from different senders (threaded:false) Response contains all 3 subject lines
011 get-mail-message 1 email with code, ID passed via SMOLCLAW_SEED_MESSAGE_ID Response contains the code
012 list-mail-folders 1 custom label (AEH-Project-Tracking) via POST users/me/labels Response contains default labels (inbox, sent, draft) AND custom label
013 list-mail-folder-messages 1 email seeded into custom label via seed_to_label Response contains the seeded message's code

Calendar (APPENG-6166)

Case MVP Requirement Seed Judge
014 list-calendar-events 3 events with distinct summaries (events list) Response contains all 3 event summaries
015 list-calendars 1 secondary calendar (AEH-Team-Calendar) via create_calendars Response contains custom calendar name
016 get-calendar-event 1 event with code, ID passed via SMOLCLAW_SEED_EVENT_ID Response contains the code
017 get-calendar-view 1 event at specific time (start/end) Response contains the code (time-range query)
018 get-schedule 1 event with specific time bounds Response contains the code + free/busy analysis

Design Principles

  • One use case per test: each case tests exactly one MVP API operation
  • No hallucination: all cases use real exec + curl against smolclaw mocks
  • Deterministic judges: check response text for expected codes/strings, no LLM judges
  • Pre-seeded data: smolclaw_seed in annotations.yaml, processed before agent execution

E2E Results

All 14 cases (001-005 existing + 010-018 new) pass at 100%:

  • smolclaw_gmail_read: 100% (4/4)
  • smolclaw_calendar_read: 100% (5/5)
  • used_exec_tool: 100% (14/14)
  • response_received: 100% (14/14)
  • 0 regressions on existing Slack/write cases

Files Changed

File Change
agent_eval/openshell/smolclaw_seed.py Add create_labels, create_calendars, seed_to_label, threaded:false, multi-event seeding
agent_eval/openshell/smolclaw_score.py Add score_gmail_read_extraction, score_calendar_read_extraction judges
examples/bootstrap-openclaw-crabline-agent-eval.sh Generate cases 010-018 with eval.yaml judges/thresholds
docs/openshell-openclaw-crabline-agent.md Document all new cases, judges, trajectory patterns

csoceanu and others added 2 commits August 24, 2026 15:00
Implement 3 new read-only Gmail evaluation cases with deterministic judges:

- case-010: List inbox → extract action-item code from team lead email
- case-011: Search by sender with forbidden_codes → locate approval code
- case-012: Read 3-message thread → summarize technical decision

New judge: score_gmail_read_extraction() validates that agent's response
contains all expected_codes and none of forbidden_codes. Proves real reads
via response content (needle-in-response pattern), not API side effects.

Seeder extension: _seed_gmail() supports messages: [...] for multi-message
threads chained via threadId. Single-message path unchanged (backward compat).

All 8 cases (001-005 + 010-012) pass 100% with deterministic judges:
✅ used_exec_tool: verified real curl calls (no hallucination)
✅ smolclaw_gmail_read: verified code extraction from responses
✅ response_received: confirmed agents replied
✅ Trajectory: 8-16 exec tool calls per case (real API interactions)
✅ smolclaw state: seeded before execution, agents read from live db

Acceptance criteria met:
✅ All cases pass 100% judge pass rate
✅ Trajectory events show real exec tool use (no hallucination)
✅ smolclaw state reflects expected read operations

Realistic seed data:
- case-010: Team sprint review (internal mgmt email)
- case-011: CI/CD alerts with decoys (search filtering test)
- case-012: Technical decision thread (multi-person discussion)

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
…nd fix threading

- Add case-013: Test list-mail-folders and list-mail-folder-messages MVP actions
  * Uses GET /users/me/labels to enumerate all available folders
  * Uses GET /users/me/messages?labelIds=<id> to list messages in specific folder
  * Reads message with GET /users/me/messages/<id>?format=full
  * Extracts project tracking code from labeled email

- Fix smolclaw_seed.py: Extract thread subject from last message (messages[-1])
  * Matches Gmail API behavior where thread subject comes from final message
  * Fixes case-012 (Carol's "RE: Database migration plan") and case-013

- Update documentation:
  * Add case-013 to case table and usage examples
  * Document threading fix in Part 3
  * Add trajectory examples for label operations
  * Update bash runner with Gmail READ case example

All 4 MVP actions (list-messages, list-folders, list-folder-messages, get-message)
now have comprehensive test coverage with real exec tool usage verified.

Co-authored-by: Cursor <cursoragent@cursor.com>
@csoceanu
csoceanu force-pushed the appeng-6165-gmail-operations branch from e19f4a9 to 22a6592 Compare August 24, 2026 14:27
@csoceanu csoceanu changed the title APPENG-6165: Add Gmail read-only operations test cases (010-012) APPENG-6165: Add Gmail read-only operations test cases (010-013) Aug 24, 2026
… single-usecase coverage

Redesign cases 010-018 so each tests exactly one MVP requirement:

Gmail (APPENG-6165):
  - case-010: list-mail-messages (3 independent emails, check all subjects)
  - case-011: get-mail-message (read by SMOLCLAW_SEED_MESSAGE_ID)
  - case-012: list-mail-folders (create custom label, check default + custom)
  - case-013: list-mail-folder-messages (create label + seed email in it)

Calendar (APPENG-6166):
  - case-014: list-calendar-events (3 events, check all summaries)
  - case-015: list-calendars (create secondary calendar)
  - case-016: get-calendar-event (read by SMOLCLAW_SEED_EVENT_ID)
  - case-017: get-calendar-view (timeMin/timeMax query)
  - case-018: get-schedule (query + compute free/busy)

smolclaw_seed.py: add create_labels, create_calendars, seed_to_label,
threaded:false for independent messages, events list for multi-event seeding.
smolclaw_score.py: add score_gmail_read_extraction, score_calendar_read_extraction.

All 14 cases pass e2e at 100% with real exec tool use, no hallucination.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@csoceanu csoceanu changed the title APPENG-6165: Add Gmail read-only operations test cases (010-013) APPENG-6165, APPENG-6166: Gmail & Calendar read-only test cases Aug 25, 2026
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.

1 participant