A Python-based application monitoring and affiliate program management system for tracking job applications, email campaigns, and affiliate portfolio status
LazyPromotion has 32 tools with READ_ONLY risk classification, but critical definition gaps severely limit usability. All tools have descriptions (positive), but most are 20-100 chars, below the 194-char baseline for production tools. Input schemas are present but minimal: most parameters lack type constraints, enums, or validation guidance. No output schemas are documented. Tools exhibit naming inconsistencies (validate_config appears twice with different contexts; normalize_text vs normalized_subject). Parameter descriptions are generic ('Configuration object', 'List of mail rows') without actionable constraints. No error handling guidance, no recovery paths, and no permission declarations. The codebase shows defensive validation internally (e.g., _safe_string, _validate_terms in application_inbox_monitor.py), but this rigor is not reflected in tool contracts exposed to agents.
Check if page is logged into the correct Gmail account.
Extract additional application records from outreach list.
Create a record for an application awaiting reply with review schedule.
Scan a bounded list window without activating mail or returning metadata.
Add stored private context to report, never reschedule or infer a provider result.
Build a report of applications awaiting human reply with review schedule.
Retrieve affiliate program by ID from registry.
No output schemas documented. Tools return complex objects (match_rows returns list of dicts with campaign_id, matching_thread_count, etc.) but agents have no schema to parse results or plan downstream calls.
Parameter descriptions are generic and lack actionable constraints. E.g., 'Configuration object with folder_name and campaigns' does not specify required fields, valid ranges, or format. Agents cannot validate inputs before calling.
Duplicate tool names with different contexts (validate_config appears in both application_inbox_monitor.py and gmail_application_monitor.py; load_config appears twice). LLMs cannot disambiguate which variant to call.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 44 | 2026-07-28+ | v2 |
Collect Gmail search result counts for configured campaigns.
Get expected translation language pair for source language.
Return attachable top-level iCloud Mail pages without changing focus.
Check if application state indicates awaiting reply.
List all affiliate programs with state and priority.
Load Gmail configuration from private file with permission checks.
Load configuration from ignored private storage.
Load and validate affiliate program registry.
Pure reference matcher returning no participant, subject, or time strings.
Extract review_after date from application object with fallback chain.
Normalize visible Mail metadata for deterministic contains matching.
Normalize email subject for comparison.
Parse an ISO date string.
Print affiliate program application packet details.
Read and parse markdown document with front matter.
Check affiliate program readiness for activation.
Generate Gmail search query from campaign rule.
Extract date from sent_at or submitted_at timestamp.
Validate and copy private matching configuration without doing any I/O.
Validate Gmail configuration object.
Validate blog editorial ledger structure and post counts.
Validate blog post structure, metadata, and translations.
Validate affiliate program registry structure and content.
Validate Gmail search results snapshot.
Allow existing sign-in redirects to settle; never operate a login form.
No error handling guidance. Tools like load_config and load_registry can fail (file not found, invalid JSON) but descriptions do not explain recovery steps or what the LLM should do next.
Tool names lack clarity on side effects. 'print_packet' suggests output to stdout, but unclear if it modifies state. 'attach_source_reviews' is vague, does it mutate the report or return a new one? Descriptions do not clarify.