CLI command
seo crawl propose, proposals, accept and dismiss
Internal link proposals: pages of a stored crawl that do not link to similar pages of the same site, proposed for the operator to accept or dismiss.
Invocation#
echo-cli seo crawl propose --crawl <crawl-id> --min-similarity <-1..1> --per-page <n> | proposals --crawl <crawl-id> | accept --crawl <crawl-id> --proposal <proposal-id> --by <who> | dismiss --crawl <crawl-id> --proposal <proposal-id> --by <who>Inputs and output#
propose and proposals write { proposals }, the targets other pages of the crawl link to least first and the most similar first among equals: id, crawl_id, from_url (the page to add the link to), to_url (the page to link to), similarity, target_inbound (how many other pages of the crawl link to the target, by the address it was asked at or answered from), and decision (accepted or dismissed), decided_by and decided_at, null while undecided. accept and dismiss write the decided proposal, without target_inbound.
State effect#
Every verb calls Echo Web's authenticated /api/seo/crawls/<id>/proposals with ECHO_INTERNAL_BEARER at ECHO_WEB_BASE_URL; the Internal link proposals section of the GEO screen and of Echo Desktop's GEO screen call the same operations, and echo-mcp runs them as echo_link_propose, echo_link_proposals, echo_link_accept and echo_link_dismiss. propose embeds every page of the crawl that answered 2xx with a title or description, from them, with the deployment's STADO_ECHO_EMBEDDING_MODEL through the Stado model router, and proposes for each page the pages most similar to it by cosine similarity that it does not already link to, at or above --min-similarity and at most --per-page of them. Proposals are kept in seo_link_proposals, one per crawl and pair of pages; proposing again keeps the decisions already made. accept reads the source page now and refuses a proposal whose source already links to its target.
Refusals#
- A wrong invocation is refused before anything is sent: "seo crawl <verb> does not take <flag>; it takes …", "<flag> needs a value" and "seo crawl <verb> needs <flag>".
- Echo Web answers a bad request with "min_similarity is required: the least cosine similarity, from -1 to 1, a proposed target must reach; got <value>", "per_page must be a positive whole number: how many targets to propose for each page at most; got <value>", "proposal_id is required: the proposal to decide, as the proposals list prints it" or "decided_by is required: who decides"; not found with "no crawl has id <id>; echo-cli seo crawl list lists them", "crawl <id> holds no page answering 2xx with a title or description to compare" or "crawl <id> has no link proposal <id>; echo-cli seo crawl proposals --crawl <id> lists them"; a conflict with "<source> already links to <target>; dismiss the proposal instead"; and fails naming the cause with "Stado model-router embeddings failed (<status>): <detail>", "<source> answered <status>, so whether it links to <target> cannot be read", "the link proposals of crawl <id> could not be stored: <cause>" or "the decision on link proposal <id> could not be stored: <cause>". The command prints Echo Web's sentence and exits 1.