0.0 / 30
What changed in the harness
Selection accuracy 98→98, token cost up 2%, unconfirmed writes 0%→0%.
Category breakdown
Where the score comes from.
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
01Safety
02Legibility
25.8 / 30
03Economics
15.4 / 20
04Discoverability
19.3 / 20
Highest-impact fix
Estimated gain +30 pointsAdd explicit identity and permission preflight tools
Expose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
Defects and rewrites.
7 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
forcedream_search_agents |
no_return_description |
Discover ForceDream agents and their honest, system-derived metrics. Optionally filter by capability (e.g. "research:citation") or free-text query. No key needed. Returns a list of matching agents, each with slug, capabilities, proof_count, and success_rate; every listed agent has real cryptographic proofs you can verify with forcedream_verify_proof. |
forcedream_score_lead |
no_return_description |
Score sales leads hot/warm/cold with weighted signals and a recommended next action — grounded in real, live verification. Cross-references detected companies, domains, and locations against 8 real sources: Wikidata, UK Companies House, EU VIES VAT validation, postcodes.io, Google PageSpeed Insights, OpenStreetMap Nominatim, DNS/MX records, and live HTTP checks. Global by design — 5 sources work for any lead worldwide; 3 regional ones (UK/EU) apply only when genuinely detected. SPENDS your balance — requires FD_API_KEY. Returns the lead score (hot/warm/cold), the supporting signals behind it, a recommended next action, what you were charged, and a proof_id. |
forcedream_generate_sentiment |
no_return_description |
Real, 14-source sentiment analysis — not just an LLM's opinion. Combines lexicon-based sentiment (VADER, AFINN), a transformer model (HuggingFace DistilBERT), toxicity (Google Perspective), entity/location verification (Wikidata, OpenStreetMap), news and community alignment (GDELT, Hacker News), grammar, readability, and language detection into one deterministic overall sentiment, urgency, and business impact score. SPENDS your balance — requires FD_API_KEY. Returns the overall sentiment label, urgency level, business impact score, per-source breakdown, what you were charged, and a proof_id. |
forcedream_market_quote |
no_return_description |
Real, live market quote for a stock symbol via Alpha Vantage. SPENDS your balance — requires FD_API_KEY. Returns the quote's price, change %, volume, day high/low, and a liquidity score for the given symbol; result is hard-cached and WORM-sealed. |
forcedream_search_reliability |
no_return_description |
Real, system-measured reliability per agent. No key needed. Returns, for the matching agent(s), success_rate, avg_latency_ms, and sample_size — the same real data exposed in forcedream_search_agents' health field, provided standalone for reliability-focused queries. |
forcedream_search_costs |
no_return_description |
Real price_per_call_pence for every registered agent. No key needed. Returns a list of agents with their price_per_call_pence, optionally filtered to those at or under max_price_pence — useful for budget-aware agent selection before invoking. |
forcedream_search_providers |
no_return_description |
Real, live inference-provider health data — the same intelligence the platform's own adaptive routing uses internally. No key needed. Returns, for each provider, health_score, breaker_state, uptime_ratio, and recent successes/failures. |
Selection evidence
Confusable tool pairs.
6 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
forcedream_search_agents |
forcedream_search_reliability |
high | forcedream_search_agents already returns success_rate as part of its metrics, and forcedream_search_reliability explicitly says it exposes 'the same real data as forcedream_search_agents' health field.' A task like 'what's the success rate/reliability of ForceDream agents' plausibly routes to either tool. |
forcedream_invoke_agent |
forcedream_security_scan |
high | forcedream_invoke_agent's own description calls out that security-scan-v1 can be invoked through it but recommends forcedream_security_scan instead — a task like 'run a security scan with ForceDream's security-scan-v1 agent' could plausibly go to either tool. |
forcedream_invoke_agent |
forcedream_score_lead |
high | forcedream_invoke_agent's description explicitly notes lead-score-v1 is invokable through it but that forcedream_score_lead is preferred for simpler input — a task naming the lead-score-v1 agent could be routed to the generic invoke tool instead of the dedicated one. |
forcedream_search_agents |
forcedream_search_costs |
medium | A budget-aware task like 'find ForceDream agents I can afford' or 'which agents are cheapest' could plausibly be sent to forcedream_search_agents (which discovers agents) instead of forcedream_search_costs (which has the actual price data), since both are agent-discovery searches with overlapping intent. |
forcedream_search_reliability |
forcedream_search_providers |
medium | Both report system 'health'/reliability metrics (success_rate/breaker_state/uptime) with no key needed; a vague task like 'check ForceDream's system health' doesn't clearly indicate whether the user wants per-agent reliability or per-provider health, risking the wrong tool being chosen. |
forcedream_search_agents |
forcedream_invoke_agent |
low | A task like 'use ForceDream's best research agent' could tempt an agent to skip discovery and call invoke_agent directly with a guessed slug rather than first searching, though the tool descriptions are distinct enough (discover vs. execute) that true selection confusion is less likely. |
Compare the field