Review Public API
Apply the fresh-worker entry gate; an
assigned output-only worker executes here without redispatching itself. Follow
the findings contract and
shared context for trust, matching, handoff
and cleanup only. Do not restart coordinator setup or invoke review-lens.
Source/diff, CI, repository-rule inspection and executable-reproduction
prerequisites do not apply; exact public paths replace source anchors.
Evidence boundary: OUTPUT-ONLY, REPORT-ONLY
- Generate candidates solely from exact
cargo public-api output. Never
open/search source, manifests/lockfiles, build scripts, docs, tests/examples,
source diffs, repository history, rustdoc JSON or rendered docs; do not supplement with
cargo metadata, rust-analyzer or code search.
- Scope/use cases orient review. Tool help/versions, diagnostics, revision IDs
and artifact metadata guide execution/matching, not API-quality claims.
packageComparison establishes presence/mode only: neither inspect its source
evidence nor infer absence from failed Cargo commands.
- Mandatory isolated post-processing uses
review-public-docs and only removes/narrows claims. It cannot add/strengthen
them, increase severity or prove runtime behavior. Keep JSON/full bundles out
of this worker; returned provenance cannot support new claims.
- Never edit, post, vote or invoke
review-delivery. Keep captures/targets
outside the unchanged reviewed worktree; remove only owned resources after
consumers finish.
Assess consumer-visible contracts using idiomatic Rust conventions and
API-visible Pragmatic Rust Guidelines. Output cannot prove
correctness, validation, panics, soundness, allocation/performance, redaction or
docs quality; docs prove intent, not behavior. State these limits once in
coverage. The caller/coordinator routes code/docs or docs/docs disagreements
with scope/artifact references to review-consistency,
never as a substitute for mandatory filtering.
Procedure
Resolve scope. Review Lens dispatches this pass every run. Proven no
Rust library scope in the coordinator's factual package inventory permits
not-applicable with provenance, without Cargo. Unknown selection or missing
required extraction is blocked. Every Rust-library change, including small,
docs-only and clean reviews, requires this procedure and filtering.
Accept caller package/manifest, revisions, features, target, toolchain and
artifacts; otherwise use the tool-selected package, --all-features and host
target. Ambiguous selection needs the package name or a blocker, not manifest
inspection. Before change extraction consume the exact
packageComparison; resolve unknown
sides/mode through its context owner or block. Head-only audits need no
baseline record.
<feature-args> defaults to --all-features, replaced only by explicit
--features/--no-default-features choices. <scope-args> contains established
package/manifest/target options; preserve toolchain through installed help.
Record effective configuration and inherited surface-affecting build flags.
Reuse only matching revision/dirty state, package, configuration, toolchain
and output options.
Establish trust/tools once. Builds can execute scripts/proc macros.
Reuse trust and version records; otherwise require trusted provenance or
isolated credential-free execution, not source inspection.
cargo public-api --version
Only if missing, install the official tool with stable:
cargo +stable install cargo-public-api --locked
Install a missing compatible nightly, honoring any caller-specified version:
rustup toolchain install nightly --profile minimal
Unsafe execution, failed installation/extraction: return blocked, exact
attempted command and decisive reason. Never troubleshoot by reading source.
Capture the full present-side surface once. Usually head; for proven
removed-package, use exact baseline in an owned disposable worktree, never
the absent head. Use an external target (CARGO_TARGET_DIR) and a documented
lock-preserving option when supported. Block if reviewed inputs would change;
external targets alone do not protect lockfiles. Capture verbatim:
cargo public-api --color=never --include function-parameter-names <feature-args> <scope-args> > <full-api-output>
Keep the complete capture despite display truncation; inventory paths/families
privately, not in handoff dumps. Optional readability view:
cargo public-api --color=never --include function-parameter-names <feature-args> -sss <scope-args> > <simplified-api-output>
Reuse matching tool artifacts/cache when supported; no mandatory second
build or JSON parsing here. -sss omits blanket, auto-trait and auto-derived
impls: Debug/Clone/Send absence claims require full output. Retain JSON
paths/provenance for downstream retrieval without opening them.
Complete every PR/change/semver comparison. Record mode, exact revisions,
presence provenance and real capture paths:
added-package: logical empty base versus full real head, including crate
module; all emitted items are additions.
removed-package: full real baseline versus logical empty head; all
emitted items are removals.
paired: real counterparts and matching API diff. Failed captures or
renamed packages never justify empty sides.
Logical emptiness is metadata, not fabricated output. Never extract/build a
proven absent package, including through commit-diff commands. For paired,
reuse a matching capture or choose one supported alternative, capturing
outside the reviewed repository:
cargo public-api --color=never --include function-parameter-names <feature-args> <scope-args> diff latest
cargo public-api --color=never --include function-parameter-names <feature-args> <scope-args> diff <version>
cargo public-api --color=never --include function-parameter-names <feature-args> <scope-args> diff <ref1>..<ref2>
Record resolved baseline version/revision, not latest. Commit diffing
checks out revisions: use an external disposable worktree, never the caller's
worktree or --force. It is neither a sandbox nor a dirty-head copy. Paired
dirty reviews require tool-supported comparison against the actual captured
head, not HEAD. One-sided dirty reviews likewise require actual dirty
captures. Unavailable required comparisons are blocked, not full-crate
fallback audits.
Inventory all emitted families before judging. Include modules/re-exports,
types/fields, traits/impls, functions/methods, constants/statics, macros,
errors/builders/iterators. Standalone audits cover the full current surface;
small diffs cover changed items/affected signatures, using immediate unchanged
families only as context. Explain full-surface scope for broad changes;
separate pre-existing concerns from regressions. Missing diffs prove neither breadth
nor no change. One-sided modes cover the full real surviving surface.
Crate-module-only scaffold output is valid, not failure or not-applicable.
Draft, then always filter. Apply lenses to the selected set with decisive
emitted excerpts; separate conditional questions and omit unprovable claims.
Run post-processing once with its complete
handoff, even for clean/empty reports. Return only its filtered report;
unavailable/failed isolation is blocked, never permission to release drafts.
Specialist questions
These are heuristics, not automatic defects. Honor guideline intent/exceptions;
require output-demonstrated consumer or compatibility cost.
Surface and names
- One clear public path per item (
M-SINGLE-ITEM-PATH)? Prefer essential root
entry types and use-case modules. Flag sprawl, fragmented paths, prelude,
traits or errors buckets only when output demonstrates the problem
(M-BALANCED-MODULES, M-NO-PRELUDE).
- Foreign re-exports/dependency signatures commit semver. Prefer defining-crate
types unless interoperability or umbrella roles justify exposure
(
M-FOREIGN-REEXPORTS, M-DONT-LEAK-TYPES). Question demonstrably redundant
scaffolding, aliases, raw options and parallel APIs; do not infer accident.
- Rust casing:
snake_case functions/modules, UpperCamelCase types/traits,
SCREAMING_SNAKE_CASE constants. Prefer precise vocabulary without empty
Manager/Helper/Util/Common/Data padding (M-WEASEL-WORDS,
M-SHORT-NAMES).
as_ borrows, to_ converts with possible copy/allocation, into_ consumes.
Prefer standard From/TryFrom/AsRef/AsMut. Getters use value(), not
get_value(); collections use iter/iter_mut/into_iter and matching
iterator names.
- Constructors are inherent associated functions, usually
new; receiver
operations are methods, unrelated computation free functions (M-REGULAR-FN).
Align sibling verbs, word order, receivers and conceptual parameter order:
important inputs first, ubiquitous context/closures last
(M-PARAMETER-CONSISTENCY).
Ergonomics and types
- Verify every public type's
Debug in full output (M-PUBLIC-DEBUG).
Readable types, especially errors/string wrappers, need Display
(M-PUBLIC-DISPLAY). Consider meaningful Clone, Copy, Default,
equality/order/hash, conversions, Borrow and formatting traits.
- Heavy service handles usually need shared-ownership
Clone, but output cannot
prove clone cost (M-SERVICES-CLONE). Full-output Send/Sync absence is a
concern only when the apparent role implies cross-thread use (M-TYPES-SEND).
- Collections:
iter, iter_mut, iterator types, owned/shared/mutable
IntoIterator, FromIterator, Extend (M-COLLECTION-TRAITS).
- Where visibly feasible, accept
impl AsRef<str/Path/[u8]>,
impl RangeBounds<_> and generic Read/Write without infecting stored types
(M-IMPL-ASREF, M-IMPL-RANGEBOUNDS, M-IMPL-IO).
- Make lifetimes/ownership legible: borrow read-only values, consume owning
conversions/builders; avoid needless caller
clone, String, Vec,
smart-pointer or lifetime requirements. Prefer async fn over impl Future
when viable, allowing trait/performance-sensitive exceptions (M-ASYNC-FN).
- Prefer strong domain/std types to ambiguous strings, booleans, tuples or
primitive clusters where names/families distinguish them (
M-STRONG-TYPES);
do not invent unrendered invariants.
- Avoid incidental
Arc/Rc/Box/Pin, lock/borrow wrappers and deeply nested
generics unless fundamental or consumer-justified (M-AVOID-WRAPPERS,
M-SIMPLE-ABSTRACTIONS). Escalate service dependencies concrete -> generic ->
dyn Trait only as needed; minimize bounds (M-DI-HIERARCHY).
- Essential behavior belongs inherently, not solely in extension traits
(
M-ESSENTIAL-FN-INHERENT). Require object usability only for clearly dynamic
extension points, not every trait.
Construction, errors and evolution
- Simple types need discoverable constructors/defaults,
Result/Option for
fallibility/absence. For many configuration permutations prefer
Type::builder(), TypeBuilder, field-named chainable setters and build();
no public TypeBuilder::new() (M-INIT-BUILDER).
- Setters should not return
Result; required cross-field validation belongs
in fallible final build() (M-BUILD-RESULT). Output cannot prove validation
is required.
- Prefer situation-specific error structs with
Debug, Display,
std::error::Error, standard From conversions and focused classification/
accessors, not global catch-all enums (M-ERRORS-CANONICAL-STRUCTS,
M-FROM-ERROR).
- Public fields commit representation: prefer private fields/accessors unless
literal construction is intended. Assess rendered
#[non_exhaustive] on
growing structs/enums and resulting construction/matching ergonomics.
- Visibly downstream-implementable traits commit evolution. Missing private
sealing machinery in output does not prove a trait unsealed.
- Question dependency types, complex bounds, associated types and concrete
returns unnecessarily fixing implementation choices, balanced against callers'
need to name, store and compose values.
Features and comparisons
- Compare only separately emitted configurations. Default-feature output says
nothing about optional surfaces; all-features output proves no individual
combination's additivity.
- Assess additions/removals/signatures only within the selected review set;
current listings alone cannot establish semver impact.
- Inventory visible macro names/signatures only; syntax, expansion hygiene,
generated bounds and behavior remain out of scope.
Proof and output
Use exact public paths and smallest decisive excerpts, including related emitted
lines needed to establish absence. Explain concrete usability, interoperability,
type-identity or compatibility cost and a specific better public shape, not an
implementation patch; cite useful M-* IDs/conventions.
Cleanliness is usually Non-blocking/Nit; blocking requires substantial,
demonstrated consumer/compatibility impact. Context-dependent alternatives are
conditional Design questions, not defects or simplified-output guesses.
Choose area or standalone role before drafting and preserve it through filtering.
Area results use the shared findings/coverage contract. Standalone outline
(omit Verdict: on the requester's own PR):
**Posted by an AI agent**
# Public API review: <package>
Scope: <tool version, package, features, target, and optional baseline>
Verdict: <approve | approve with non-blocking comments | changes requested | blocked>
## Findings
<Shared finding blocks, exact public paths and API excerpts; impact order.>
## Design questions
<Conditional Design notes using the findings contract.>
## What is already clean
<Specific strengths, no generic praise.>
## Coverage and limitations
<Families/configurations, rustdoc filtering coverage and evidence limits.>
Distinguish excerpts with code formatting. Explicitly report no findings with
covered families/configurations when clean. Extraction failure returns
blocked and decisive diagnostics, not an API verdict. The coordinator owns
combined presentation/delivery; this worker returns only the filtered report.
1---2name: review-public-api3description: Audit a Rust library's exported contract using cargo-public-api output only, then isolated rustdoc-based filtering of provisional claims. Use for a whole-crate or explicit output-only API audit, or review-lens's mandatory output-only pass; small PRs cover changed public items and their immediate family. Applies idiomatic Rust API practices and API-visible Pragmatic Rust Guidelines. Not for source-based findings, implementation correctness, docs quality/consistency, performance or posting.4---56# Review Public API78Apply the [fresh-worker entry gate](../review-lens/worker-isolation.md); an9assigned output-only worker executes here without redispatching itself. Follow10the [findings contract](../review-delivery/findings-contract.md) and11[shared context](../review-lens/review-context.md) for trust, matching, handoff12and cleanup only. Do not restart coordinator setup or invoke `review-lens`.13Source/diff, CI, repository-rule inspection and executable-reproduction14prerequisites do **not** apply; exact public paths replace source anchors.1516## Evidence boundary: OUTPUT-ONLY, REPORT-ONLY1718- Generate candidates solely from exact `cargo public-api` output. Never19 open/search source, manifests/lockfiles, build scripts, docs, tests/examples,20 source diffs, repository history, rustdoc JSON or rendered docs; do not supplement with21 `cargo metadata`, rust-analyzer or code search.22- Scope/use cases orient review. Tool help/versions, diagnostics, revision IDs23 and artifact metadata guide execution/matching, not API-quality claims.24 `packageComparison` establishes presence/mode only: neither inspect its source25 evidence nor infer absence from failed Cargo commands.26- Mandatory isolated [post-processing](rustdoc-post-processing.md) uses27 `review-public-docs` and only removes/narrows claims. It cannot add/strengthen28 them, increase severity or prove runtime behavior. Keep JSON/full bundles out29 of this worker; returned provenance cannot support new claims.30- Never edit, post, vote or invoke `review-delivery`. Keep captures/targets31 outside the unchanged reviewed worktree; remove only owned resources after32 consumers finish.3334Assess consumer-visible contracts using idiomatic Rust conventions and35API-visible [Pragmatic Rust Guidelines][pragmatic-rust]. Output cannot prove36correctness, validation, panics, soundness, allocation/performance, redaction or37docs quality; docs prove intent, not behavior. State these limits once in38coverage. The caller/coordinator routes code/docs or docs/docs disagreements39with scope/artifact references to [`review-consistency`](../review-consistency/SKILL.md),40never as a substitute for mandatory filtering.4142## Procedure43441. **Resolve scope.** Review Lens dispatches this pass every run. Proven **no45 Rust library scope** in the coordinator's factual package inventory permits46 `not-applicable` with provenance, without Cargo. Unknown selection or missing47 required extraction is `blocked`. Every Rust-library change, including small,48 docs-only and clean reviews, requires this procedure and filtering.4950 Accept caller package/manifest, revisions, features, target, toolchain and51 artifacts; otherwise use the tool-selected package, `--all-features` and host52 target. Ambiguous selection needs the package name or a blocker, not manifest53 inspection. Before change extraction consume the exact54 [packageComparison](../review-lens/package-comparison.md); resolve `unknown`55 sides/mode through its context owner or block. Head-only audits need no56 baseline record.5758 `<feature-args>` defaults to `--all-features`, replaced only by explicit59 `--features`/`--no-default-features` choices. `<scope-args>` contains established60 package/manifest/target options; preserve toolchain through installed help.61 Record effective configuration and inherited surface-affecting build flags.62 Reuse only matching revision/dirty state, package, configuration, toolchain63 and output options.64652. **Establish trust/tools once.** Builds can execute scripts/proc macros.66 Reuse trust and version records; otherwise require trusted provenance or67 isolated credential-free execution, not source inspection.6869 ```text70 cargo public-api --version71 ```7273 Only if missing, install the official tool with stable:7475 ```text76 cargo +stable install cargo-public-api --locked77 ```7879 Install a missing compatible nightly, honoring any caller-specified version:8081 ```text82 rustup toolchain install nightly --profile minimal83 ```8485 Unsafe execution, failed installation/extraction: return `blocked`, exact86 attempted command and decisive reason. Never troubleshoot by reading source.87883. **Capture the full present-side surface once.** Usually head; for proven89 `removed-package`, use exact baseline in an owned disposable worktree, never90 the absent head. Use an external target (`CARGO_TARGET_DIR`) and a documented91 lock-preserving option when supported. Block if reviewed inputs would change;92 external targets alone do not protect lockfiles. Capture verbatim:9394 ```text95 cargo public-api --color=never --include function-parameter-names <feature-args> <scope-args> > <full-api-output>96 ```9798 Keep the complete capture despite display truncation; inventory paths/families99 privately, not in handoff dumps. Optional readability view:100101 ```text102 cargo public-api --color=never --include function-parameter-names <feature-args> -sss <scope-args> > <simplified-api-output>103 ```104105 Reuse matching tool artifacts/cache when supported; no mandatory second106 build or JSON parsing here. `-sss` omits blanket, auto-trait and auto-derived107 impls: `Debug`/`Clone`/`Send` absence claims require full output. Retain JSON108 paths/provenance for downstream retrieval without opening them.1091104. **Complete every PR/change/semver comparison.** Record mode, exact revisions,111 presence provenance and real capture paths:112 - `added-package`: logical empty base versus full real head, including crate113 module; all emitted items are additions.114 - `removed-package`: full real baseline versus logical empty head; all115 emitted items are removals.116 - `paired`: real counterparts and matching API diff. Failed captures or117 renamed packages never justify empty sides.118119 Logical emptiness is metadata, not fabricated output. Never extract/build a120 proven absent package, including through commit-diff commands. For `paired`,121 reuse a matching capture or choose one supported alternative, capturing122 outside the reviewed repository:123124 ```text125 cargo public-api --color=never --include function-parameter-names <feature-args> <scope-args> diff latest126 cargo public-api --color=never --include function-parameter-names <feature-args> <scope-args> diff <version>127 cargo public-api --color=never --include function-parameter-names <feature-args> <scope-args> diff <ref1>..<ref2>128 ```129130 Record resolved baseline version/revision, not `latest`. Commit diffing131 checks out revisions: use an external disposable worktree, never the caller's132 worktree or `--force`. It is neither a sandbox nor a dirty-head copy. Paired133 dirty reviews require tool-supported comparison against the actual captured134 head, not `HEAD`. One-sided dirty reviews likewise require actual dirty135 captures. Unavailable required comparisons are `blocked`, not full-crate136 fallback audits.1371385. **Inventory all emitted families before judging.** Include modules/re-exports,139 types/fields, traits/impls, functions/methods, constants/statics, macros,140 errors/builders/iterators. Standalone audits cover the full current surface;141 small diffs cover changed items/affected signatures, using immediate unchanged142 families only as context. Explain full-surface scope for broad changes;143 separate pre-existing concerns from regressions. Missing diffs prove neither breadth144 nor no change. One-sided modes cover the full real surviving surface.145 Crate-module-only scaffold output is valid, not failure or `not-applicable`.1461476. **Draft, then always filter.** Apply lenses to the selected set with decisive148 emitted excerpts; separate conditional questions and omit unprovable claims.149 Run [post-processing](rustdoc-post-processing.md) once with its complete150 handoff, **even for clean/empty reports**. Return only its filtered report;151 unavailable/failed isolation is `blocked`, never permission to release drafts.152153## Specialist questions154155These are heuristics, not automatic defects. Honor guideline intent/exceptions;156require output-demonstrated consumer or compatibility cost.157158### Surface and names159160- One clear public path per item (`M-SINGLE-ITEM-PATH`)? Prefer essential root161 entry types and use-case modules. Flag sprawl, fragmented paths, `prelude`,162 `traits` or `errors` buckets only when output demonstrates the problem163 (`M-BALANCED-MODULES`, `M-NO-PRELUDE`).164- Foreign re-exports/dependency signatures commit semver. Prefer defining-crate165 types unless interoperability or umbrella roles justify exposure166 (`M-FOREIGN-REEXPORTS`, `M-DONT-LEAK-TYPES`). Question demonstrably redundant167 scaffolding, aliases, raw options and parallel APIs; do not infer accident.168- Rust casing: `snake_case` functions/modules, `UpperCamelCase` types/traits,169 `SCREAMING_SNAKE_CASE` constants. Prefer precise vocabulary without empty170 `Manager`/`Helper`/`Util`/`Common`/`Data` padding (`M-WEASEL-WORDS`,171 `M-SHORT-NAMES`).172- `as_` borrows, `to_` converts with possible copy/allocation, `into_` consumes.173 Prefer standard `From`/`TryFrom`/`AsRef`/`AsMut`. Getters use `value()`, not174 `get_value()`; collections use `iter`/`iter_mut`/`into_iter` and matching175 iterator names.176- Constructors are inherent associated functions, usually `new`; receiver177 operations are methods, unrelated computation free functions (`M-REGULAR-FN`).178 Align sibling verbs, word order, receivers and conceptual parameter order:179 important inputs first, ubiquitous context/closures last180 (`M-PARAMETER-CONSISTENCY`).181182### Ergonomics and types183184- Verify every public type's `Debug` in **full** output (`M-PUBLIC-DEBUG`).185 Readable types, especially errors/string wrappers, need `Display`186 (`M-PUBLIC-DISPLAY`). Consider meaningful `Clone`, `Copy`, `Default`,187 equality/order/hash, conversions, `Borrow` and formatting traits.188- Heavy service handles usually need shared-ownership `Clone`, but output cannot189 prove clone cost (`M-SERVICES-CLONE`). Full-output `Send`/`Sync` absence is a190 concern only when the apparent role implies cross-thread use (`M-TYPES-SEND`).191- Collections: `iter`, `iter_mut`, iterator types, owned/shared/mutable192 `IntoIterator`, `FromIterator`, `Extend` (`M-COLLECTION-TRAITS`).193- Where visibly feasible, accept `impl AsRef<str/Path/[u8]>`,194 `impl RangeBounds<_>` and generic `Read`/`Write` without infecting stored types195 (`M-IMPL-ASREF`, `M-IMPL-RANGEBOUNDS`, `M-IMPL-IO`).196- Make lifetimes/ownership legible: borrow read-only values, consume owning197 conversions/builders; avoid needless caller `clone`, `String`, `Vec`,198 smart-pointer or lifetime requirements. Prefer `async fn` over `impl Future`199 when viable, allowing trait/performance-sensitive exceptions (`M-ASYNC-FN`).200- Prefer strong domain/std types to ambiguous strings, booleans, tuples or201 primitive clusters where names/families distinguish them (`M-STRONG-TYPES`);202 do not invent unrendered invariants.203- Avoid incidental `Arc`/`Rc`/`Box`/`Pin`, lock/borrow wrappers and deeply nested204 generics unless fundamental or consumer-justified (`M-AVOID-WRAPPERS`,205 `M-SIMPLE-ABSTRACTIONS`). Escalate service dependencies concrete -> generic ->206 `dyn Trait` only as needed; minimize bounds (`M-DI-HIERARCHY`).207- Essential behavior belongs inherently, not solely in extension traits208 (`M-ESSENTIAL-FN-INHERENT`). Require object usability only for clearly dynamic209 extension points, not every trait.210211### Construction, errors and evolution212213- Simple types need discoverable constructors/defaults, `Result`/`Option` for214 fallibility/absence. For many configuration permutations prefer215 `Type::builder()`, `TypeBuilder`, field-named chainable setters and `build()`;216 no public `TypeBuilder::new()` (`M-INIT-BUILDER`).217- Setters should not return `Result`; required cross-field validation belongs218 in fallible final `build()` (`M-BUILD-RESULT`). Output cannot prove validation219 is required.220- Prefer situation-specific error structs with `Debug`, `Display`,221 `std::error::Error`, standard `From` conversions and focused classification/222 accessors, not global catch-all enums (`M-ERRORS-CANONICAL-STRUCTS`,223 `M-FROM-ERROR`).224- Public fields commit representation: prefer private fields/accessors unless225 literal construction is intended. Assess rendered `#[non_exhaustive]` on226 growing structs/enums and resulting construction/matching ergonomics.227- Visibly downstream-implementable traits commit evolution. Missing private228 sealing machinery in output does **not** prove a trait unsealed.229- Question dependency types, complex bounds, associated types and concrete230 returns unnecessarily fixing implementation choices, balanced against callers'231 need to name, store and compose values.232233### Features and comparisons234235- Compare only separately emitted configurations. Default-feature output says236 nothing about optional surfaces; all-features output proves no individual237 combination's additivity.238- Assess additions/removals/signatures only within the selected review set;239 current listings alone cannot establish semver impact.240- Inventory visible macro names/signatures only; syntax, expansion hygiene,241 generated bounds and behavior remain out of scope.242243## Proof and output244245Use exact public paths and smallest decisive excerpts, including related emitted246lines needed to establish absence. Explain concrete usability, interoperability,247type-identity or compatibility cost and a specific better public shape, not an248implementation patch; cite useful `M-*` IDs/conventions.249250Cleanliness is usually `Non-blocking`/`Nit`; blocking requires substantial,251demonstrated consumer/compatibility impact. Context-dependent alternatives are252conditional **Design questions**, not defects or simplified-output guesses.253254Choose area or standalone role before drafting and preserve it through filtering.255Area results use the shared findings/coverage contract. Standalone outline256(omit `Verdict:` on the requester's own PR):257258```text259**Posted by an AI agent**260261# Public API review: <package>262263Scope: <tool version, package, features, target, and optional baseline>264Verdict: <approve | approve with non-blocking comments | changes requested | blocked>265266## Findings267<Shared finding blocks, exact public paths and API excerpts; impact order.>268269## Design questions270<Conditional Design notes using the findings contract.>271272## What is already clean273<Specific strengths, no generic praise.>274275## Coverage and limitations276<Families/configurations, rustdoc filtering coverage and evidence limits.>277```278279Distinguish excerpts with code formatting. Explicitly report no findings with280covered families/configurations when clean. Extraction failure returns281`blocked` and decisive diagnostics, not an API verdict. The coordinator owns282combined presentation/delivery; this worker returns only the filtered report.283284[pragmatic-rust]: https://microsoft.github.io/rust-guidelines/