Title: agent: trace all registry consumers when adding a new tool · Issue #1850 · usethis-python/usethis-python · GitHub
Open Graph Title: agent: trace all registry consumers when adding a new tool · Issue #1850 · usethis-python/usethis-python
X Title: agent: trace all registry consumers when adding a new tool · Issue #1850 · usethis-python/usethis-python
Description: What happened When adding ZensicalTool to the project, the tool was registered in ALL_TOOLS and use_tool(), but ZensicalToolSpec was not added to ALL_TOOL_SPECS. Additionally, multiple test files contained hardcoded expected values (usag...
Open Graph Description: What happened When adding ZensicalTool to the project, the tool was registered in ALL_TOOLS and use_tool(), but ZensicalToolSpec was not added to ALL_TOOL_SPECS. Additionally, multiple test files c...
X Description: What happened When adding ZensicalTool to the project, the tool was registered in ALL_TOOLS and use_tool(), but ZensicalToolSpec was not added to ALL_TOOL_SPECS. Additionally, multiple test files c...
Opengraph URL: https://github.com/usethis-python/usethis-python/issues/1850
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"agent: trace all registry consumers when adding a new tool","articleBody":"## What happened\n\nWhen adding `ZensicalTool` to the project, the tool was registered in `ALL_TOOLS` and `use_tool()`, but `ZensicalToolSpec` was not added to `ALL_TOOL_SPECS`. Additionally, multiple test files contained hardcoded expected values (usage table rows, CLI output strings, dependency assertions) that referenced the old documentation framework instead of the new one. These omissions caused 8 test failures in CI that were not caught before pushing.\n\n## Root cause\n\nAdding a new tool requires coordinated updates across multiple registries (`ALL_TOOLS`, `ALL_TOOL_SPECS`, `use_tool()`) and multiple test files with hardcoded expected values that enumerate all tools or reference toolset outputs. The spec registry and test expectations were overlooked because the focus was on the core implementation and dispatch registration.\n\n## Generalised principle\n\nWhen adding a new entry to any registry or canonical list, always trace **all consumers** of that registry — including parallel registries that must stay in sync and test files with hardcoded expected values that enumerate registry contents. A useful heuristic: search the codebase for the name of the most recently added entry (the one just before yours) to find every place that lists tools, and update each one. Grepping for the sibling entry is more reliable than trying to remember all the registration points from memory.\n\n## Resolution\n\nAdded `ZensicalToolSpec` to `ALL_TOOL_SPECS` in `src/usethis/_tool/impl/spec/all_.py`. Updated hardcoded expected values in `tests/usethis/_core/test_list.py` (3 usage table tests), `tests/usethis/_ui/interface/test_doc.py` (dependency assertion), and `tests/usethis/_ui/interface/test_init.py` (3 CLI output strings). See commit 2d8bca6.\n\n## Follow-up\n\nNone — the `test_in_sync_with_all_tools` test already enforces that `ALL_TOOL_SPECS` and `ALL_TOOLS` stay in sync, which is what surfaced part of this issue. The remaining test failures (hardcoded output strings) are inherently manual to maintain.","author":{"url":"https://github.com/nathanjmcdougall","@type":"Person","name":"nathanjmcdougall"},"datePublished":"2026-04-07T07:25:28.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/1850/usethis-python/issues/1850"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:849980f9-af44-7354-3e96-90a27e58eb28 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | D240:1F0B:2B9280:397FF3:6A4EC24C |
| html-safe-nonce | 54d471cb6831b80dbc590a8086c96fdca045b95a31aedc4bae88d6f58ced5609 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJEMjQwOjFGMEI6MkI5MjgwOjM5N0ZGMzo2QTRFQzI0QyIsInZpc2l0b3JfaWQiOiI0MzA3OTM3MDI1Mjc1NjQyNDQ1IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | e3d70fe26f63b5c575fd362dfb3b31b856f7a1fd4fe8e96b8b6089c8ae2d151b |
| hovercard-subject-tag | issue:4216138550 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/usethis-python/usethis-python/1850/issue_layout |
| twitter:image | https://opengraph.githubassets.com/a14a2ab7e32c336a640960782d20b962a13cd0ffa440d9c542e57a82dac606bd/usethis-python/usethis-python/issues/1850 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/a14a2ab7e32c336a640960782d20b962a13cd0ffa440d9c542e57a82dac606bd/usethis-python/usethis-python/issues/1850 |
| og:image:alt | What happened When adding ZensicalTool to the project, the tool was registered in ALL_TOOLS and use_tool(), but ZensicalToolSpec was not added to ALL_TOOL_SPECS. Additionally, multiple test files c... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | nathanjmcdougall |
| hostname | github.com |
| expected-hostname | github.com |
| None | 41b6ab3ba6d20a71766ac245b5a4a94c6fc672a9cd4da7d44c1b33ab8bf6a21c |
| turbo-cache-control | no-preview |
| go-import | github.com/usethis-python/usethis-python git https://github.com/usethis-python/usethis-python.git |
| octolytics-dimension-user_id | 216362695 |
| octolytics-dimension-user_login | usethis-python |
| octolytics-dimension-repository_id | 842189705 |
| octolytics-dimension-repository_nwo | usethis-python/usethis-python |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 842189705 |
| octolytics-dimension-repository_network_root_nwo | usethis-python/usethis-python |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | e6a744804e8e70f97b4d5a18a94dcc63db22f97a |
| ui-target | canary-2 |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width