Conversation
…lish (#33) CONSUMER_KEYS parsing errors surfaced only on the first authenticated request (opaque 500, even breaking the env-bootstrap admin key) because the key store was lazily built. Build it eagerly in create_app() right after verify_production_secrets(), so a misconfigured deploy dies on boot like the rest of the config. Also documents REQUEST_TIMEOUT_S in .env.example and adds a router-level test that thinking:false round-trips.
…ult, Opus 4.6) (#33) Account has US-regional model access only, which the Messages/Mantle endpoint can't target. Add a boto3 Converse provider (bedrock-runtime) using the us. cross-region inference profiles; default provider + model switched to it. Mantle provider kept for accounts with global access. Adaptive thinking via additionalModelRequestFields; standard Bedrock billing (credits apply). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…onsumed; clarify null_keys docstring
… key store, Dockerfile (#33) - bedrock_converse: validate default model at construction; narrow BotoCoreError (timeouts->504, creds/param faults->502); guard unexpected response shapes->502 - key_store: reject duplicate prefixes and non-list scopes (fail-fast config) - config: request_timeout_s must be > 0 - conftest: also clear the key-store cache between tests - Dockerfile: run uvicorn as a non-root user (Trivy DS-0002) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…33) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(llm): shared internal LLM service — POST /chat via Amazon Bedrock (#33)
Resolve ci.yml (keep both verification-test and llm-test jobs; docker-build already merged cleanly) and regenerate uv.lock to include both workspace members. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ues (#45) Pass default=str to json.dumps in AuditLogMiddleware emit so a non-JSON-serializable audit_extra value (datetime, set, Decimal, custom object) is stringified instead of raising and silently dropping the entire audit line, including security-relevant core fields, via the blanket except Exception pass.
… drop the line (#45)
feat(llm): request/response logging — model + token usage on the audit line (#45)
feat(bot): helper bot → LLM service wiring, threaded @mention Q&A (#66)
- Atomic increment_attempts (replaces set_attempts) so concurrent invalid confirms can't bypass the 5-attempt lockout (Postgres UPDATE ... RETURNING). - Postgres create_code -> atomic upsert (ON CONFLICT) instead of delete+insert. - request-code sends before persisting and maps EmailSendError -> 502, so a delivery failure neither stores an unsendable code nor rate-limits retry. - GmailSender: HTTP timeout, num_retries, and EmailSendError wrapping. - ConfirmCodeIn.subject now trimmed/non-empty like RequestCodeIn; tighter email regex. - verify_production_secrets covers DATABASE_URL dev default and EMAIL_BACKEND=fake. - Harden verification-test CI job (contents: read, persist-credentials: false). - Tests: +14 (config guards, atomic increment, email-failure 502, subject validation). Skipped (with reason): SecretStr for settings (repo-wide, inconsistent to do in one service; audit middleware never logs secrets) and EmailStr/email-validator dep (kept lightweight validation; deliverability is proven by the code). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds a ResendSender behind the EmailSender interface (stdlib HTTP, injectable transport for tests), a resend email_backend option, and RESEND_API_KEY/EMAIL_FROM config with matching verify_production_secrets guards. Gmail adapter retained as an alternative. Chosen over Gmail domain-wide delegation, which needs Workspace super-admin. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The blocked-ready automation only matched "Blocked by:" with a colon, so issues written "Blocked by #73" (e.g. #74, #76) were silently untracked -- their blocked label could never auto-clear. Make the colon optional (still requiring a separator space) so both forms work. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(ci): accept "Blocked by #N" without a colon in blocker automation
Resend's API is behind Cloudflare, which blocks the default Python-urllib User-Agent with 'error code: 1010' (403). Send an explicit User-Agent so the request goes through; verified end-to-end delivery. Test asserts the header. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…50) /link now requests a one-time code from the verification service instead of linking immediately; a new /verify-code command confirms the code and completes linkDiscord for the verified email. Adds verificationClient.js mirroring directoryClient.js error-class pattern, wires config/context for VERIFICATION_BASE_URL/VERIFICATION_API_KEY, and updates linkService, messages, and tests accordingly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…Client (CodeRabbit #79) - AbortController timeout (15s) so /link and /verify-code can't hang on a stalled verification service (mirrors llmClient.js). - Drain unread response bodies (202 + fallthrough paths) to release undici sockets. - Dedup confirm-code error branches via a status->error map. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(bot): fold email verification into /link + /verify-code (#50)
7 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promote
staging→ productionShips the accumulated staging work to production:
/linkfold-in (Fold verification into /link + add /verify-code #50)services/llm, first time in prodRailway production has been pre-configured for the new services (llm + verification: build config, env vars, prod DBs; discord-bot:
LLM_*+VERIFICATION_*vars) so the prod deploys boot cleanly on merge.🤖 Generated with Claude Code