docs: retarget the CLI to its actual domain; fix prog/console-script drift#2
Conversation
…drift
The scaffold clone from culture-agent-template renamed the package but left
the CLI describing itself as "a clonable template for AgentCulture mesh
agents" — and left `prog` disagreeing with the declared console script.
pyproject.toml declares the binary `embeddings`, but `prog` and every help,
docstring, and explain-catalog string said `embeddings-cli`. So the commands
the CLI printed about itself — including the README quickstart and its own
`learn` / `explain` output — were not runnable:
$ uv run embeddings-cli whoami
error: Failed to spawn: `embeddings-cli`
Retarget the self-documentation to the real domain (studying embedding spaces
as systems: regions, neighborhoods, directions, gaps, density, cross-model
differences; the Surveyor agent and its evidence-backed Atlas), and settle the
naming: invocations read `embeddings`, while `embeddings-cli` stays the dist,
repo, and nick. The explain catalog keys both spellings to the root entry.
The survey surface (survey, regions, neighbors, directions, gaps, compare,
map) is named under explicit "planned / not yet implemented" headings in
README, learn, explain, and overview, so an agent reading the CLI never
mistakes a roadmap verb for a callable one. None of it is implemented.
test_prog_matches_declared_console_script guards the pairing by reading the
console script out of pyproject.toml rather than asserting a literal, so a
future rename that updates only one side fails loudly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019SWoCWX2v7w5g4f5yUcT6X
|
/agentic_review |
|
PR Summary by QodoRetarget docs to embeddings domain and align CLI
AI Description
Diagram
High-Level Assessment
Files changed (16)
|
Code Review by Qodo
1. Overstrict scripts test
|
| assert "usage: embeddings" in capsys.readouterr().out | ||
|
|
||
|
|
||
| def test_prog_matches_declared_console_script() -> None: |
There was a problem hiding this comment.
1. Overstrict scripts test 🐞 Bug ⚙ Maintainability
test_prog_matches_declared_console_script asserts there is exactly one [project.scripts] entry and then picks the first key, so adding any future console-script alias would fail tests even if prog still matches the intended primary script. This makes the regression guard more brittle than its stated goal (pairing), creating avoidable maintenance/test failures.
Agent Prompt
## Issue description
`test_prog_matches_declared_console_script` currently enforces `len(scripts) == 1` and uses `next(iter(scripts))` to choose the declared script name. This is stricter than necessary and will fail if an additional script/alias is added (even if the main pairing remains correct).
## Issue Context
The intended invariant is: the parser's `prog` matches the console script name that points at `embeddings.cli:main`.
## Fix Focus Areas
- tests/test_cli.py[28-50]
- pyproject.toml[22-24]
## Suggested fix
Parse `[project.scripts]`, then select the script name(s) whose value equals `"embeddings.cli:main"` (or `"embeddings.cli:main"` via a constant), assert exactly one such match, and compare that key to `_build_parser().prog`. This keeps the guard while allowing additional unrelated scripts.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
|
|
||
| > What kind of world does this embedding model create? | ||
|
|
||
| The CLI can embed a representative corpus, survey the resulting space, identify |
There was a problem hiding this comment.
2. Planned commands seem runnable 🐞 Bug ⚙ Maintainability
The README shows a runnable-looking bash block for survey/regions/neighbors/... before the “Status” section clarifies these verbs are not implemented, so readers may copy/paste and immediately hit failures. This undercuts the PR’s goal of clearly separating planned verbs from callable ones.
Agent Prompt
## Issue description
The README presents a normal bash command block for unimplemented verbs before the explicit not-implemented warning in the Status section. Readers often copy the first code block they see, so this can cause immediate confusion.
## Issue Context
You already have a strong `## Status` disclaimer, but it appears after the example block.
## Fix Focus Areas
- README.md[29-60]
## Suggested fix
Move the command block under a heading like "Planned (not yet implemented)" or place a one-line warning immediately above the block (e.g., "Planned verbs (not yet implemented):") and adjust surrounding text to avoid phrasing like "The CLI can ..." for unimplemented behavior.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Why
This repo was scaffolded from
culture-agent-template. The clone renamed thepackage but left two things behind: the CLI still described itself as "a
clonable template for AgentCulture mesh agents", and
progdisagreed with thedeclared console script.
pyproject.tomldeclares the binaryembeddings, whileprogand everyhelp string, docstring, and
explaincatalog entry saidembeddings-cli. Sothe commands the CLI printed about itself — including the README quickstart and
its own
learn/explainoutput — were not runnable:An agent orienting itself via
learnorexplaingot a command map where everyentry failed.
What changed
Domain.
README.mdnow describes whatembeddings-cliis actually for:studying embedding spaces as systems — semantic regions and clusters,
neighborhoods and boundaries, recurring directions of meaning, dense/sparse
areas, coverage gaps, and differences between models — treating an embedding
model as a semantic landscape, and serving as the deterministic tool surface for
a Surveyor agent that records an evidence-backed Atlas.
learn,explain/catalog.py, andoverviewwere retargeted to match.Naming settled. Invocations read
embeddings ...;embeddings-clistays thedist name, repo name, and
culture.yamlnick.progis nowembeddings, soevery usage and error line is copy-pasteable. The
explaincatalog keys both("embeddings",)and("embeddings-cli",)to the root entry, so either spellingresolves.
Planned verbs are marked as such. The survey surface —
survey,regions,neighbors,directions,gaps,compare,map— is named in README,learn,explain, andoverviewunder explicit not yet implementedheadings. None of it is implemented in this PR; this is docs and string
retargeting only. The separation is deliberate so an agent reading the CLI never
mistakes a roadmap verb for a callable one.
Regression guard.
test_prog_matches_declared_console_scriptreads theconsole script out of
pyproject.tomland assertsprogmatches — guarding thepairing rather than a literal, so a future rename that updates both stays green
while one that updates only one side fails loudly.
CLAUDE.mdreplaces its roadmap placeholder with the real domain, recordsthe naming convention, and flags three design constraints the survey surface will
force: runtime dependencies (clustering and
map --htmlneed numpy at minimum,which is incompatible with the inherited zero-dependency property), the rubric
shape of
directions discover(a noun with an action-verb also needs anoverviewsub-verb), and Atlas persistence (nothing writes to disk today).Verification
The rubric gate now probes the CLI as
embeddings(explain_self: explain embeddings), confirming the console script andprogagree.Version bumped 0.6.0 → 0.7.0.
Notes
workflow.sh deltareports no.claude/skills.local.yamlon this machine (it isgit-ignored; only the
.exampleis committed), so no sibling alignment dump wasavailable. These changes are repo-local domain documentation and CLI strings —
no
.claude/skills/content was touched — so no sibling broadcast applies.