aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/plans
AgeCommit message (Collapse)AuthorFilesLines
2026-08-09docs: stop crediting from None with secret hygieneDanilo M.1-7/+7
A TimeoutExpired chained without from None already prints no secret, since its __str__ shows only the command and the duration. The suppressed display buys a tidier traceback, not a narrower leak, and the comments claimed otherwise. The from None calls stay. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09fix: sharpen key resolution errors, rename KeyResolutionErrorDanilo M.1-29/+169
Raise KEY_TIMEOUT to 120s: a graphical pinentry plus a hardware token the user has to find and touch makes 30s a plausible successful unlock, and failing one converts a slow success into an error the user can only retry against the same clock. Point the timeout message at a pinentry that never appeared, which is the silent failure, rather than at one the user is already looking at. Name the binary when pass is missing instead of reporting a bare Errno 2. Raise from None so a partial secret on the failed process stdout stays out of printed tracebacks, and record on the cache that it is unlocked only because every caller resolves on the GUI thread today. Rename KeyError_ to KeyResolutionError before later tasks import it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09fix: skip unusable provider names, name the split ceilingDanilo M.1-1/+65
A provider name containing a colon builds ids that split back to a different provider, and an empty name builds ':model'; both routed to the local router under a nonsense name with no error, so parse() now skips them. split() stays non-injective by design, since bare local ids are the premise here, so the residual risk is recorded as a ponytail comment with its upgrade path rather than hidden. Also pin the trailing-colon form Task 9 relies on, and the empty-needle filter, which were correct but untested. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09fix: stop a partial [providers.local] from deleting the local providerDanilo M.1-5/+35
The synthesis guard tested key membership, so a [providers.local] that set only an api_key claimed the slot, blocked the bare base_url from filling it, then failed the URL check and vanished. Losing the local provider is the one outcome this feature cannot have. The guard now tests the URL and merges, so the table adds detail to the local provider rather than replacing it. A filter given as a bare string was iterated character-wise, turning filter = "qwen" into four needles that match almost every model id. Both failures were silent, which is what made them worth fixing now. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09docs: implementation plan for external cloud providersDanilo M.1-0/+2521
Sixteen TDD tasks. Providers, model-id namespacing and key resolution go in a new providers.py; metadata and cost math in models.py; the settings dialog in modeldialog.py, keeping ui.py from growing further. The last task is manual: it needs a real key and spends real money, and it is where cloud tool-calling behaviour gets found out rather than guessed at. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>