Two small gaps that make person provider awkward for agents to drive. They are independent and can land separately.
1. No in-place edit
person provider add refuses an existing name and there is no set command. Because reasoning_effort, output_mode, and token_limit_parameter are part of the fingerprint, every tuning change is:
remove -> add (with network check) -> consent -> use -> daemon restart
Proposal: person provider set <name> --reasoning-effort high ... that rewrites the profile in place, re-runs the synthetic check, and revokes the old consent. That preserves the "any edit needs a fresh check and consent" rule while cutting the cycle to set -> consent -> restart.
2. Negotiation errors are opaque
ProviderError keeps the HTTP status and request id, but CapabilityChecker.Negotiate (internal/peoplesweep/capability_check.go) collapses every failure to "provider capability negotiation failed". A wrong model name and a rejected parameter look the same.
The classifier in internal/peoplesweep/http_driver.go already parses bounded structured fields (code, type, param for OpenAI and Anthropic, reason and parameter for Google) to decide whether to fall back. Proposal: carry those fields, plus status and request id, on the returned error. Free-text provider messages stay excluded so nothing from the response body is echoed.
Context
Raised in the #694 review.
Two small gaps that make
person providerawkward for agents to drive. They are independent and can land separately.1. No in-place edit
person provider addrefuses an existing name and there is nosetcommand. Becausereasoning_effort,output_mode, andtoken_limit_parameterare part of the fingerprint, every tuning change is:Proposal:
person provider set <name> --reasoning-effort high ...that rewrites the profile in place, re-runs the synthetic check, and revokes the old consent. That preserves the "any edit needs a fresh check and consent" rule while cutting the cycle toset -> consent -> restart.2. Negotiation errors are opaque
ProviderErrorkeeps the HTTP status and request id, butCapabilityChecker.Negotiate(internal/peoplesweep/capability_check.go) collapses every failure to "provider capability negotiation failed". A wrong model name and a rejected parameter look the same.The classifier in
internal/peoplesweep/http_driver.goalready parses bounded structured fields (code,type,paramfor OpenAI and Anthropic,reasonandparameterfor Google) to decide whether to fall back. Proposal: carry those fields, plus status and request id, on the returned error. Free-text provider messages stay excluded so nothing from the response body is echoed.Context
Raised in the #694 review.