agentpoints Β· job list
Persistent backlog of deferred work, surfaced issues, and "we'll come back to this" items so nothing drops off the radar between sessions.
Renders at /queue. Updated by committing to docs/queue.md. Anything in here is open unless explicitly marked (done) β kept visible for ~7 days after close so ben can see what shipped recently.
Last updated: 2026-05-18.
p1 β open
Landing-page framing block: "legally structured agent-owner participation"
Why it matters: the canonical disclaimer (footer + /points + /terms, 2026-05-20) links readers to "the homepage for the full framing on legally structured agent-owner participation." That homepage framing doesn't exist yet β the link currently points at the existing landing hero. A short, plain-English block explaining the agent-owner participation model would close that loop.
Sketch: a section on / that covers:
- what an "agent-owner" is (the verified human or agent behind a registered card)
- why participation is "legally structured" (UK Companies House registration, terms, reputation-only scints, no securities offering)
- the line between contribution (rewarded with scints) and entitlement (none β scints are not money, equity, or future tokens)
- pointer to /terms for the long form
Keep it ~150 words, no marketing-speak. Same voice as the footer disclaimer.
Status: queued. Drafted on ben's ask 2026-05-20.
Canonical taxonomy + agent-card direction (ben 2026-05-19, supersedes the older 10-claw system)
This is now the north star. Anything else in this doc bends to it.
One canonical taxonomy: Sector β Niche β Agent.
- Sector = broad economic / industry area (22 of them). e.g.
healthcare-ops,legal,financial-services. - Niche = specific workflow / opportunity (346 of them). e.g.
outbound-sales-sdr,ai-phishing-detection,clinical-guideline-adherence. Lives inOpportunityNiche. - Agent = the listed entity. Can be a product, framework, API, SDK, MCP server, package, marketplace, repo, directory, template, research demo, or service provider.
The 10 claws are demoted. Rename Agent.niche β Agent.legacyClaw (or communityCategory). Keep for backward-compat / optional future "community lens". NOT primary navigation.
Public card fields (the ones to render on every detail page):
- Sector
- Niche
- Type (derived from entityType + nodeScope: e.g. commercial_agent_product, framework, MCP server, package, SDK, repo, marketplace, API, directory, template, research_demo)
- Agent Level (L0βL5; L0 = ecosystem infrastructure, NOT bad β keep public)
- Authority (none / read-only / drafts-only / external actions / infrastructure / financial β this is the strategic differentiator: "how autonomous/dangerous is this?")
- Lifecycle
Hidden / internal / secondary (used by pipeline, not shown publicly):
- actionAuthority, humanOversight, taskScope, persistenceLevel, classifierVerdict, registerability
- micro-niche / node / claw as words β don't surface them in UI copy
capabilities[] stays as search/tag metadata.
Add Agent.opportunityNicheId FK so every agent points to one canonical niche. Backfill from existing data where confident; leave unmapped where unsure.
UI rules:
- Never show blank class-card sections. Use "Not yet classified" when a field is unknown.
- Remove "agent card: not found" β it leaks internal protocol concepts into public UI and reads as broken. Replace with positive-only badges (Claimed by owner / Official integration / Verified metadata / Embedded profile connected) or show nothing.
- Do not publicly use the words "node", "claw", "micro-niche" in user-facing copy.
Ecosystem entities are welcome, not suppressed.
GitHub repos / frameworks / SDKs / APIs / MCP servers / marketplaces / templates / research demos are all valid Agent rows. The bug is poor entity resolution, not "wrong kind of thing". The fix is enrich β resolve parents β classify β name β logo β review the weak ones. NOT mass suppression.
Publish gate validates quality, doesn't suppress breadth. A row publishes if:
- canonical entity name exists
- non-generic handle/name
- entity-specific description exists
- type resolved
- niche resolved where possible
- logo resolved
- parent-child relationship resolved where relevant
- sensible link ordering
Bad enrichment β candidate_review (not hard reject).
Implementation order (cheapest β highest impact):
1. UI: remove "agent card: not found" + replace with positive-only badges. (~10 min)
2. UI: rework the detail-page class card to show Sector / Niche / Type / Agent Level / Authority / Lifecycle in that order; demote everything else to a collapsed "debug" details panel. (~30 min)
3. Schema: add Agent.opportunityNicheId (nullable FK to OpportunityNiche). No migration risk because nullable. (~10 min for the schema + db push)
4. Backfill: tag each Agent with the best-match niche from its candidate's suggestedNiche + DirectoryProfile signals. (~30 min)
5. Listing page navigation: chip rows become Sector + Niche (not the 10 claws). Legacy claw becomes a secondary filter. (~30 min)
6. Rename Agent.niche β Agent.legacyClaw everywhere. (~30 min)
7. Wire publish gate into promoter with candidate_review routing.
QC root-cause fix (ChatGPT brief + ben correction 2026-05-19): entity resolution + per-platform enrichment BEFORE publish
Principle (corrected by ben 2026-05-19, do not lose): AgentPoints maps the agentic ecosystem, including products, frameworks, repos, SDKs, templates, APIs, MCP servers, benchmarks, directories, and research demos. GitHub/npm/PyPI/HuggingFace/docs pages are NOT bad by default. Many important agent-economy nodes live on those platforms. The bug is poor entity resolution β every public node must be named and described as the thing it actually is, not as the hosting platform.
Scale of the entity-resolution failure (n=2,558 live public agents):
- generic link-text handles: 73 (2.9%) β
view_on_github,python_sdk,npm_,github_,read_now, etc. - bios describing hosting platform generically ("GitHub is a developer platformβ¦", "PyPIβ¦", "Hugging Faceβ¦"): 43 (1.7%)
- blank class cards (no DirectoryProfile): 7
- sub-page primary URLs (gh/npm/pypi/hf/docs): 252 (9.9%) β a population to enrich properly, not a population to block.
Promoter is paused (2026-05-19 12:33 UTC) β agentpoints-promote.timer stopped + disabled on openclaw. Classifier still verdicts pending rows. Nothing reaches Agent until promoter restarted.
#### Per-platform publish rules (ben/ChatGPT)
GitHub repos can publish if: repo name is canonical, README/metadata fetched, description specific to the repo, nodeLabel correct (Project / Framework / Template / MCP server / Tool / Research-demo), bio does NOT describe GitHub itself.
npm / PyPI packages can publish if: package name is canonical, package description fetched, parent project/vendor detected where possible, nodeLabel correct (Package / SDK / Tool), bio does NOT describe npm/PyPI itself.
Docs pages can publish if: they represent a real framework/API/tool/protocol, canonical name is framework/tool name (not "Docs" or "Overview"), nodeLabel correct (Docs / Framework / API / Protocol), official product/project link is primary where available.
Hugging Face spaces/benchmarks can publish if: canonical benchmark/model/project name is clear, nodeLabel correct (Research-demo / Benchmark / Model / Tool), bio describes the actual benchmark/project not Hugging Face.
SDKs / integrations / templates: if discovered from a parent product (sourceAgentHandle set), attach as child/related node where appropriate; if independently branded and useful, publish as ecosystem node. Never publish with generic names like "Python SDK".
Directories: keep as Directory nodes and source seams; crawl their outbound product links; do NOT create repeated cards for directory listing pages.
#### The publish-time gate (required of every row before promote)
Every row must satisfy ALL FIVE before Agent.upsert:
1. accurate canonical name β never generic link text ("View on GitHub", "Python SDK", "Examples", "Docs", "Read more", "Installation", "Quickstart", etc.)
2. accurate nodeLabel β Project / Framework / Template / MCP server / Tool / Research-demo / Package / SDK / Docs / API / Protocol / Benchmark / Model / Directory / Product
3. specific description β about the entity itself, not the hosting platform. Regex-block bios opening "GitHub is", "npmjs", "PyPI is", "Hugging Face is", etc.
4. taxonomy / class card populated (Sector β Niche β entityType + agentLevel / nodeScope / actionAuthority / persistenceLevel / registerability where applicable; "not yet classified" is acceptable but blank is not)
5. primary / secondary links ordered sensibly β vendor/product/protocol/benchmark URL first; github/npm/pypi/docs secondary. For child nodes, parent vendor URL primary.
If any one fails β status stays candidate_review, not Agent.
#### Enrichment improvements (so the gate has data to check)
agentpoints-enrich needs per-platform branches:
- github.com/<owner>/<repo>: fetch repo metadata via GitHub API (homepage, description, topics) + first 4KB of README; derive canonical name from
<repo>+ repo display name; detect MCP server / framework / template / research-demo via topics + README keywords. - npmjs.com/package/<pkg>: fetch npm registry JSON for description, homepage, repository, keywords; canonical =
<pkg>unless homepage clearly points to a parent product with a better name. - pypi.org/project/<pkg>: same shape via PyPI JSON API.
- huggingface.co/spaces/<id> or /<org>/<model>: fetch HF API for description, tags, model/space type.
- docs.<X>.com/...: extract
<title>/ og:title; canonical =<X>framework name (not the page title); primary URL becomes<X>.comif reachable.
Stop writing "GitHub is a developer platformβ¦" bios in any branch.
#### UI hygiene
- Hide "agent card: not found" unless we actually have an agent-card feature to surface.
- For child/linked pages, use parent/vendor logo when available (lyzr subpages β lyzr logo; vocode SDK β vocode logo).
- Favicon CSS already uses
object-fit: contain; check no aggressive scaling pushed. - Render the class card (Sector β Niche β entityType + agentLevel / nodeScope / etc.) on every detail page; "not yet classified" labels for unknown fields, never blank sections.
#### Backfill scope (after gate + enrichment ship)
Re-process the 73 generic-handle + 43 generic-bio + (most of) 252 sub-page-primary rows through the new enrichment + gate. Per feedback_regnum_is_concrete.md: failures opt-out to recycle, never delete; regNums stay put. Specific cases ChatGPT flagged for backfill:
- @view_on_github β rename to @gitagent (or merge if duplicate of existing upstream).
- @python_sdk β relabel as Vocode Python SDK; attach as child of @vocode.
- @npm_eccagentshield β enrich from ecc.tools + npm registry; relabel as ECC AgentShield (Package nodeLabel).
- @investment_banking_agents β use Lyzr logo + class card; treat as Lyzr investment-banking sub-page.
- @langchain_deep_agents β Framework/Docs ecosystem node; populate class card.
- @seclabtaskflowagent β Package node; complete class card.
- @deepresearch_bench{,_ii} β Benchmark / Research-demo nodes; complete class cards.
- @domainspecific_mcp_servers β Cloudflare MCP server; cloudflare developers page primary, GitHub secondary.
Implementation order (cheapest β highest yield):
1. Publish-time gate function (lib/publish-gate.ts) + plumb into app/api/candidates/claim. Gate rejects to candidate_review if any of the 5 requirements fail. Self-contained, no schema change.
2. Per-platform enrichment branches in agentpoints-enrich. Adds GitHub / npm / PyPI / HF / docs metadata fetches.
3. Class-card UI on detail page (renders the taxonomy tree + class fields).
4. UI hygiene fixes (hide "agent card: not found", parent-logo fallback, link ordering).
5. One-shot backfill of the 8 named cases + the population-level re-enrichment.
Status: queued. Promoter paused. Discovery pipeline intact.
card UI: surface DirectoryProfile.whatItDoes (Starship case)
Ben 2026-05-19: the @home_starship_technologies_aut card has no visible info about what they do (deliver food by robot). Investigated β the data IS there: directoryProfile.whatItDoes contains "Starship Technologies provides autonomous robot delivery services, utilizing a fleet of sidewalk robots for last-mile delivery..." with profileCompleteness=95.
Root cause: the agent detail card renders the short Agent.bio field but does NOT surface DirectoryProfile.whatItDoes / useCases / profileInterpretation. The richer enriched data is silent.
Fix:
/agents/[handle]page: preferDirectoryProfile.whatItDoesoverAgent.biowhen present, fall back to bio if missing.- Render
useCases[]as a bullet list under "What you can use it for". - Render
profileInterpretationas a small muted line ("Editor's note: ...") β especially useful when the enricher flagged the agent as NOT-a-software-agent (Starship case).
Status: queued.
news-article candidates β secondary product-name search before publish
The problem: the spider grabs articles from fortune.com / techcrunch / venturebeat / theinformation etc. that describe a real product, but the candidate ends up as the article-paraphrase rather than the product. Worst case: same article spawns multiple rows (canva_ai_agent #275, canva_ai_suite #329, canva_ai_2 #2495 β all from the same fortune.com Canva AI 2.0 piece, none pointing at canva.com).
Ben's fix (2026-05-19): when the candidate's primary URL is a news-host article, do a secondary Google search for the product name. If a real product URL is found, that becomes the canonical sourceUrl and the candidate is legit. News hosts are NOT a blacklist β they're a trigger for additional research, not a death sentence. Many legitimate products are first discovered through a news article; we want to keep them.
Sketch:
1. Detect news-host primary URL. Treat as "needs research" β not as a reject signal. Hosts: fortune.com, techcrunch.com, venturebeat.com, theinformation.com, medium.com, substack.com, arxiv.org. (docs/not-an-agent-patterns.md lists more.)
2. Extract product name from the candidate bio/title via a small LLM call (Gemini Flash-Lite, ~$0.0003): "What product is this article about? Return JSON {productName: string, owningCompany: string | null}".
3. Run a single DataForSEO Google query for "<productName>" "<owningCompany>". Filter results: drop news/article hosts; keep only sites that look like product/company pages.
4. Merge logic:
- If a clear product URL is found β set it as sourceUrls[0], demote the article to sourceUrls[1] as evidence, re-run the classifier on the new primary.
- If multiple product URLs found β keep all, prefer the bare-domain root.
- If no product URL is found β status stays candidate_review (manual triage), not auto-reject. Some genuine products have weak SEO and won't surface on a single query; we'd rather queue them for review than throw them away.
5. De-dup is per-product, not per-platform. Many companies legitimately launch multiple distinct agent products (e.g. Lyft might ship a rider agent AND a driver-ops agent). The dedup rule: collapse rows only when the resolved product URL matches an existing Agent.sourceUrls[0] AND the product name is the same. Different products from the same company β two separate rows is correct.
Cost: ~$0.001 per candidate (DataForSEO) + ~$0.0003 (extract product name). Hundreds of candidates β low single digits of dollars.
Backfill: one-shot script that runs the same logic over existing news-host-primary live rows; merge/dedupe/review as above. Estimate: 50-200 affected rows.
Status: queued for "when things calm down" per ben 2026-05-19. Hard requirements:
- Must not violate the regNum-stability rule β duplicates get
opted_out(slot kept for recycle), never deleted. - News-host primary URL is a trigger, not a disqualifier.
- Multiple legitimate products from the same company must survive de-dup.
Starship + similar "indexed but not actually an agent" rows
Ben 2026-05-19: Starship Technologies is a physical robotics / food-delivery company, not a software agent or AI platform. The enricher correctly flagged it in profileInterpretation, but it still landed as a normal indexed card.
Fix options:
- A. Operator opt-out (manual): mark these rows status=opted_out, recycle the slot per the existing rule.
- B. Auto-classify: when
profileInterpretationcontains "NOT a software agent" / "NOT an AI" / "physical service" patterns, auto-flip toagentLevel=L0_non_agent_nodeand demote from the main directory listing. - C. Re-classify with the new 4-verdict scheme β Starship would land in candidate_review or reject.
Recommendation: B + C combined. Cron sweep that scans profileInterpretation for non-agent flags + reclassifies via Gemini using the 4-verdict prompt. ~1h job once the rest of the funnel is stable.
Status: queued.
strategic frame β 2026-05-19 (read before all p1 work)
Ben directive 2026-05-19: the broad micro-niche search campaign worked (346 niches searched, 3,366 candidates queued, $3.33 spent, 0 zero-yield). Search supply is no longer the bottleneck. Quality, classification, dedupe, and intelligence are.
Strategic frame:
- AgentPoints does not just list agents. It shows where agents are missing. Map of the agentic economy. Value for founders, VCs, operators, AI-displaced workers.
- Solved.works is the eventual brand β clearer, more human, aligns with "helping people find what AI has not solved yet". Rebrand frozen until the intelligence layer is sharper β final brand fits the bigger mission, not the current state.
- Directories are source seams, not junk. AI Agents Directory, theresanaiforthat, futuretools, etc. should be crawled for outbound product links (not inserted as agent cards). Store the directory page as
discoveredVia/sourceUrl, queue the destination product sites as candidates. - Startup briefs stay free + shareable. No paywall. Goal is viral distribution + market authority. Real prize: becoming the default map of the agentic economy.
Priority order for the intelligence layer (top of queue):
1. Wait + monitor the Gemini classifier cron processing the 3,366 new candidates. Real downstream FP rate is the next measurable signal.
2. Directory-aware crawler (next-extract pattern) β convert known directories from "ban" to "extract outbound product URLs". Fixes the G2 / aiagentsdirectory tension.
3. Startup-viability score layer β full spec at docs/specs/startup-viability-scores.md. 6 fields, composite formula, 4th lens on /opportunities, bubble-chart re-encoding, "Generate startup brief" one-click.
4. Free shareable startup briefs β full spec at docs/specs/startup-briefs-free-shareable.md. No paywall, public URL, share-to-X/LinkedIn, soft email capture after view, success-metrics list.
5. Cap-constrained deepening pass β full spec at docs/specs/cap-constrained-deepening-pass.md. 79 niches qualify; 12 niche-specific variants per niche via Sonnet; target 25-50 accepted; ~$5 budget.
Status: strategic frame set 2026-05-19. Active item: #1 (passive β let classifier work).
opportunity-scoring method v1 (move off v0 multiplicative)
Ben directive 2026-05-18: current scoring is v0 (pure multiplicative expectedDensity = ag Γ ec Γ ge / 10000). Too punitive β one low score (especially geo) crushes economically huge niches. Move to v1.
Spec (full text saved at /opt/pincrs/data/opportunities/method-v1-spec.txt if I copy it across):
v1 expected-density formula:
```
base = 0.45 Γ agentability + 0.40 Γ economic + 0.15 Γ geo
geo multiplier:
geo β₯ 85 β Γ1.00
70-84 β Γ0.95
55-69 β Γ0.85
<55 β Γ0.70
expectedDensity = round(base Γ multiplier)
```
v1 observed-coverage weighting (by agentLevel):
- L4/L5: 1.0
- L3 workflow agent: 0.8
- L2 tool-using assistant: 0.6
- L1 FAQ/chat: 0.3
- L0 infra/API/framework/marketplace: 0.2-0.4 (depending on relevance)
- unknown: 0.2 until classified
v1 opportunity score:
```
opportunityScore = expectedDensity β min(60, observedWeightedDensity Γ 8)
```
v1 crowding labels: empty(0) / sparse(β€2) / emerging(β€6) / crowded(>6) weighted nodes.
Also build: /opportunities/method public page explaining all this β agentability/economic/geo definitions, formula, observed-coverage weighting, crowding, limitations. Link from /opportunities as "How this is scored". Add limitation note: "This is directional market intelligence based on the live AgentPoints directory and heuristic scoring. It is not investment advice."
Why it matters: v0 buries regulated-but-valuable niches (clinical decisioning, trading) because of low geo. v1 lets economic + agentability carry the score with geo as a confidence dampener, not a guillotine.
Status: queued. Implement after v0 estimates are reviewed/averaged.
singleton micro-niche review (due 2026-06-01)
Why it matters: 29 micro-niches added 2026-05-18 in the second-pass seed each matched exactly one public agent. Per ben's directive, keep them in place for 14 days, then review: if a singleton STILL has β€1 public match, decide whether it's a real niche awaiting more discoveries or a one-off product worth dropping.
Review on: 2026-06-01. Run scripts/_post_merge_report.js and look at the "singletons (1)" section.
The 29 singletons: phishing-triage-agent, cloud-resource-request-fulfilment, ci-cd-optimization-agent, on-call-management-agent, press-release-generation-agent, faq-generation-agent, product-description-generation, cross-sell-upsell-agent, production-schedule-optimization, anomaly-classification-agent, production-yield-optimization, water-network-monitoring-agent, freight-shipping-coordinator, freight-invoice-audit-agent, inventory-tracking-agent, camera-feed-operator-agent, covenant-extraction-agent, radiology-reporting-copilot, chemical-regulatory-intelligence, text-to-cad-agent, ai-spreadsheet-agent, quantum-control-automation, ai-risk-vendor-monitoring, autonomous-ai-research-lab, ai-compute-optimization-infra, residency-scheduling-agent, ai-agent-framework-hooks, llm-serving-infrastructure (+ agent-network-protocol post-merge).
Status: scheduled for 2026-06-01.
agent-class classifier is not on a cron β most rows show "unknown"
Ben observation 2026-05-18: "Why do all agents not have the following info updated?!"
Example from a freshly-indexed card:
```
agent class
agent level: unknown
action authority: unknown
human oversight: unknown
task scope: unknown
node scope: product
persistence: persistent identity
owner type: commercial owner
registerability: claimable indexed row
```
The four unknown fields (agentLevel / actionAuthority / humanOversight / taskScope) are populated by scripts/classify-agent-levels.js. That script has never been wired to a systemd timer β it only runs when manually invoked with npm run classify:agent-levels. Same failure mode as the opportunity scorer was earlier today: built as a script, never put on a cron.
The four populated fields (nodeScope / persistenceLevel / ownerType / registerability) come from scripts/backfill-identity-and-productisation.js, also manual-only.
Fix:
1. Add a systemd timer on prod that runs classify-agent-levels.js hourly (cheap, deterministic, no LLM).
2. Add a systemd timer for the identity-fields backfill too.
3. Better: call both inline from /api/agent/index right after row creation, so new agents are classified within seconds rather than waiting for the cron tick (mirrors the inline opportunity-scorer slice already drafted at lib/inline-score.ts).
Status: queued.
placeholder-domain block at /api/agent/index
Why it matters: probed 200 newest agents on 2026-05-18 β 97% sourceUrls alive, BUT 2 of the 4 failures were LLM-hallucinated example.com URLs (https://research-agent.example.com, https://research-synthesis.example.com). The reserved IANA placeholder domains (example.com, example.net, example.org, placeholder.com, localhost, IP literals) should be blocked at the gate.
Sketch: add a PLACEHOLDER_HOSTS set to the existing quality gate in /api/agent/index/route.ts, reject if every sourceUrl hostname matches. Trivial. Also a one-shot to retire existing example.com rows.
Status: queued, ~30 min job.
source-url liveness recheck
Why it matters: the existing agentpoints-recheck.timer (daily 04:17 UTC) runs ENRICHMENT β refreshes DirectoryProfile fields, re-reads source pages for new content. It does NOT HEAD-probe the Agent.sourceUrls[] list for liveness. A URL that goes 404 a year from now stays on the agent row indefinitely. Ben noticed this on 2026-05-18.
Sketch: new script scripts/probe-source-urls.js already drafted as a one-shot. Promote to a daily cron: HEAD each sourceUrl with a 6s timeout + browser UA, store Agent.sourceUrlStatus (alive/dead/checked-at), surface "broken source link" pill on cards with all-dead URLs. Run nightly at low priority (~$0 cost, just network + DB writes).
Status: queued, half-built (probe script exists).
pricing crawler (deeper extraction)
Why it matters: 56% of cards (893 of 1,594) sit at "Pricing not yet known" after the UI fix shipped on 2026-05-18. Enricher's first-pass extraction is missing pricing on a majority. Most "missing" cards aren't actually missing β they're at /pricing or /plans on the source domain and the enricher didn't follow that link.
Sketch: when first-pass enrichment leaves pricingModel=null|unknown, run a focused follow-up: probe /pricing, /plans, /price, /pricing/, /plans/, /tariffs on the source domain, fetch the first that returns 200, feed to LLM with a strict "extract the pricing model + tier list" prompt. Adds ~1 HTTP fetch + 1 small LLM call per affected card.
Estimated lift: could reduce "Pricing not yet known" from 56% to maybe 25-35%.
Status: queued. Not started.
classifier throughput tuning
Why it matters: the 2026-05-18 funnel report showed candidates queue ~31h between insert and classifier verdict. Classifier is FIFO with capacity ~800/hour; spider was inserting much faster overnight. The classifier isn't broken, it's under-resourced.
Sketch: the classifier service runs every 15 min with batch=20 Γ maxBatches=10 = 200 candidates per tick. Two knobs:
maxBatchesβ 50: 1,000 candidates per tick, 4,000/hour. Clears overnight backlogs in ~6h instead of 31h. ~5Γ OpenRouter spend on the classifier (still cheap at ~$10/day).- Or: aggressive pre-classifier domain blocklist (tripadvisor.de, youtube, etc.) so junk doesn't even hit the LLM.
Status: queued. Ben directive: "do not tune classifier throughput yet" (during the opp-seeded debug). Lift now that opp-seeded is unblocked.
10-language global rollout
Why it matters: Full plan saved at project_agentpoints_multilingual_plan.md in claude memory. Top-10 markets (US/UK/DE/FR/ES/PT/JP/IN/KO/IT). Per ben: "First 1500 must be high quality" β the language rollout is the natural next coverage push once the search-factory is stable.
Sketch: schema adds Agent.sourceLanguage + Agent.bioNative + DirectoryProfile.whatItDoesNative. overnight-loop.js rotates (country, language) pairs across batches. Sonnet generates queries in target language. Card UI gets EN β <lang> toggle.
Sequencing: Germany pilot first for 24h to validate yield + quality, then full firehose. Cost: ~$1,300/month at full volume.
Status: plan saved, not started.
in-card "request pricing" CTA
Why it matters: complement to the operator claim-prompt β let visitors flag "this card needs pricing" as a demand signal we can route to outreach.
Sketch: small link under the "Pricing not yet known" headline: β Flag for outreach. Click sets Agent.needsPricingOutreach = true. Cron later notifies ben or DM's the owner.
Status: discussed 2026-05-18, queued.
favourites for logged-in users (agents + cards)
Why it matters: ben browsing the directory wants to bookmark agents he'd actually use (e.g. #2432 tracecat_mcp β "Drive Tracecat from your own agent harness over MCP"). Visitors today have no way to come back to a card they liked without searching. A favourites list also gives us a strong telemetry signal β which agents real humans actually save β feeding into the intelligence layer.
Sketch:
- New table
Favorite(userId, agentId, createdAt) β small + indexed on userId. FK isagentId(the row's PK), notregNumβ see regNum-stability rule below. - Heart icon top-right of every agent card (listing + detail). Logged-out β CTA to claim/login. Logged-in β toggle.
- New page
/me/favouriteslisting the user's saved agents (sortable; same card style as/agents). - Telemetry roll-up: top-N most-favourited agents per niche, surfaced on the niche pages and on
/opportunities(favourites as a third demand signal alongside SERP density).
Requested by: ben, 2026-05-19, after favouriting #2432 tracecat_mcp.
regNum stability rule (hard invariant, applies to favourites and everything else)
The rule: Agent.regNum is a concrete public slot identifier. Never renumber existing rows to close a gap. #2432 means tracecat_mcp. If a row is opted out (markntel_advisors-style sweep), leave its regNum intact with status='opted_out'; the /api/agent/index recycle path will mutate that exact slot in place when the next genuine candidate arrives. Gaps in the regNum sequence are expected and fine.
Why it matters: ben favourites/bookmarks specific regNums and cites them in messages ("read #2432"). External references β favourites, share links, screenshots, citations β would all break the moment any record shifted. Even one shift would cascade and invalidate every regNum above it. This is a higher-priority rule than tidy-looking sequences.
Persistent references should use UID, not regNum. RegNum is the display identifier; Agent.uid (CP-XXXXXX) is the identity identifier and survives a recycle event. Favourites, well-known URLs, and integration callbacks should all key on uid.
Status: durable invariant; codified in feedback memory.
p2 β open
funnel-investigation follow-up: domain blocklist pre-classifier
The 2026-05-18 funnel report observed: "Drop low-signal candidates pre-classifier β domain blocklist of known-junk hosts (tripadvisor/youtube/wikipedia) so the classifier doesn't waste its budget." Listed as option 3 in that report. Currently un-actioned.
opt out #1246, #1277, openai_operator_ai (pending ben approval)
Three indexed rows that the 2026-05-17 quality gate would now block but that landed before the gate shipped. Should be opted-out so they stop appearing in the directory. Per the 2026-05-13 ledger-rule incident: I won't touch these without explicit ben go-ahead.
run-alternative-to-x.js instrumentation
Only the UA fix landed on this script during the 2026-05-18 opp-seeded debug. The full per-result skip-reason instrumentation that went into run-opportunity-seeded.js was not back-ported. Worth doing before the daily 06:15 UTC alt-daily cron fires for real coverage.
bilingual cards UI toggle
Schema fields for bioNative + sourceLanguage are not yet on the Agent model. Part of the 10-language rollout but standalone-shippable once a non-English agent gets indexed.
"Most missing" dashboard on /agents/review
Today's /agents/review queues needsReview=true rows. Could augment with a sort: "rows with no pricing, no DirectoryProfile, oldest first" so review effort goes where the gaps are biggest.
p3 β open
MCP server exposing the directory
The directory is an asset for consumer agents (Hermes, OpenClaw, etc.) to query. Eventually we want an MCP server they can connect to so the API is first-class for agent consumption. Defer until at least one consumer agent is using us heavily.
A2A-shaped query endpoint
Same theme as the MCP server: agents querying /api/agents?niche=...&agentLevel=L3&country=DE should get an A2A-spec response.
Wallet UI + P2P transfers
Per the long-term plan: centralised ledger + wallet first, external bridge later. Schema supports it; UI exposes only balances at present. Send-to-handle + receive flow not yet built.
Domain-control claim flow (well-known endpoint)
Schema field domainClaimToken exists. Endpoint /api/agent/claim-wellknown exists. UI flow + docs for the operator side haven't been built yet.
recently done (last 7 days)
- 2026-05-18 β opportunity scorer was on no cron at all (last run 27h ago). Wired
pincrs-score-opportunities.timerto run hourly at :32 UTC on prod. Coverage 17.8% β 23.0% from one run; will climb as the cron ticks. - 2026-05-18 β homepage charts merged into single panel (search bar + growth chart + map thumbnail, side-by-side on desktop, stacked on mobile). Search reveals micro-niches the matches sit in.
c/metarelabeledplatform. Search button now always inline with input. - 2026-05-18 β placeholder-URL bug: 10 curator-listed agents with
*.example.comsourceUrls found. Gate now blocks (a) any all-placeholder request and (b) any request where every sourceUrl fails a HEAD probe. Recycling extended beyond Genesis cohort to any opted-out row. 10 known-bad rows opted out β next 10 genuine indexes will recycle their regNums in-place. - 2026-05-18 β opportunity-seeded debug: fixed missing User-Agent + missing discoveryMethod in allowlist. 459-results-0-inserts β 26/47 inserts on diagnostic run.
- 2026-05-18 β pricing visibility fix (3-state badge, claim prompt, filter chips, enricher prompt patched, 834 filler-summary rows cleared).
- 2026-05-18 β opp-seeded cron switched from daily 05:15 to hourly :15 with mode=new (drain unsearched as they appear), weekly Sunday 05:15 for resweep.
- 2026-05-18 β opportunity-seeded + alternative-to-X search modes shipped (B + alt-to-X loops from the strategy discussion).
- 2026-05-17 β 18 β homeClaw β niche rename across schema + 41 files + 510 refs (DB columns kept stable via Prisma @map).
- 2026-05-17 β agentLevel classification (L0-L5) + actionAuthority + humanOversight + taskScope on Agent. Classifier shipped. Live on /graph quadrant + /agents/[handle] card + opportunity scorer.
- 2026-05-17 β quality gate at /api/agent/index (debug-marker bios, article-title handles, sentence-shaped handles, pure-media sources).
- 2026-05-17 β strip-bio-debug-prefix one-shot (307 + 4 rows cleaned of [search_factory_*]/query: prefixes).
- 2026-05-17 β agent-card identity block + opportunities map productisation + niches Γ opportunity scatter.
conventions
- Add a new item by editing
docs/queue.mdand committing. Markdown only. - Move from open β done by editing in place, adding date + 1-line summary.
- After ~7 days in "done", remove (git history preserves it).
- Priority: p1 = next slice, p2 = soon, p3 = strategic / deferred.