pingfusi: clone websites pixel-perfect and polish any AI-built draft, verified with review rounds. Enforced, gated workflow — a green check is a command that exits 0, never a screenshot.
pingfusi provides 10 tools with explicit input schemas and descriptions visible in packages/core/index.js and packages/core/ping.js. Most tools follow verb_noun naming conventions (request_review, wait_for_results, get_test_results, draft.push, draft.delete, ping) and have structured input parameters with types. However, several critical gaps limit the score: (1) No documented output schemas for any tool, callers cannot know what fields to expect, making chaining difficult. (2) Descriptions are functional but sparse (ranging 50-180 chars, below the 194-char baseline for A+ tools). (3) Error handling guidance is absent, tools return results but do not document what failures look like, recovery paths, or retry semantics. (4) Parameter descriptions lack format constraints and validation rules (e.g., n_target accepts 1-256 but lacks enum or range notation; max_wait_seconds and timeoutMs have no bounds stated). (5) Tool composition is reasonable but state-file coupling (review.file, review.wait, review.verify) creates implicit dependencies not documented in parameter descriptions. The server is production-grade in API design (stateless, HTTP-based, proper bearer auth), but tool definitions fall short of A-grade LLM-optimized standards.
Delete a hosted draft by slug.
Upload a static directory as a hosted draft, verify served bytes match bundle, return draft record with slug and URL.
Get the current status and metadata of a hosted draft by slug.
Fetch the latest verdict and responses for a review round by ping_id.
Ask the review service one question (ping) and get immediate feedback.
File a review round against a spec with steps, options, and verdict settings. Returns ping_id for tracking.
File a round and record it in the caller's state file. Validates spec against service caps before submission.
No documented output schemas. Tools return results but callers cannot know what fields to expect, making downstream tool chaining fragile and forcing LLMs to infer structure.
Tool descriptions lack depth. Most descriptions are 50 - 70 chars (below 194-char baseline); they state WHAT but not WHEN to use or WHY (vs similar tools). No dependency hints (e.g., 'Call request_review first, then wait_for_results').
Parameter constraints missing. n_target accepts 1 - 256 but no enum/range constraint is declared in schema. max_wait_seconds and timeoutMs have no documented bounds. LLMs may pass invalid values without validation feedback.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Fetch and verify the LATEST round's verdict from persisted state. Returns structured outcome with approval/rejection verdict and comments.
One client-safe continuation leg for pending reviews. Polls until results available or timeout.
Wait for review results to be available, polling with timeout. Client-safe continuation for pending review rounds.
No error handling guidance. Tool definitions do not document failure modes, retryability, or recovery paths. What happens if a ping_id is invalid? Is wait_for_results retryable? Are there rate limits?
Implicit state coupling. review.file, review.wait, and review.verify all depend on a stateFile parameter and implicit sequencing (file → wait → verify). This dependency chain is not documented as a multi-step workflow in parameter descriptions.
Naming ambiguity in draft tools. 'draft.push', 'draft.status', 'draft.delete' use dot notation (namespace.verb) instead of verb_noun (push_draft, get_draft_status, delete_draft). This is non-standard and may confuse LLM tool selection logic that expects snake_case.
Review tool naming inconsistency. 'review.file', 'review.wait', 'review.verify' use dot notation, but 'request_review', 'wait_for_results', 'get_test_results' use snake_case. This inconsistency signals two tool sets with overlapping functionality (e.g., request_review vs review.file, wait_for_results vs review.wait) without clear disambiguation.