--- title: Workflow Remediation Plan — 2026-06-10 Audit tags: [audit, workflow, plan, remediation] created: 2026-06-10 status: draft --- # Workflow Remediation Plan — 2026-06-10 Audit ## Division of Labour | Finding | Severity | Assignee | Rationale | |---|---|---|---| | C1 (secrets rotation) | Critical | Mistral → rotation doc (Haiku writes checklist) | Rotation is human action; doc is mechanical | | C2 (LLM proxy auth) | Critical | Sonnet | Auth pattern integration needs codebase knowledge | | H1 (bot claim URL) | High | Haiku | Mechanical serializer split — no domain logic | | H2 (file ownership) | High | Sonnet | Needs to read ownership model from DB schema | | H3 (oracle quoting) | High | Sonnet (grouped with H4+M3) | Same file, complex payment logic | | H4 (UUID/JWT mismatch) | High | Sonnet (grouped with H3+M3) | Same file, identity normalization | | M3 (permit relay) | Medium | Sonnet (grouped with H3+H4) | Same file, rate-limit implementation | | M4 (debug panel) | Medium | Mistral | Simple role-gating change | | M5 (scanner startup) | Medium | Mistral | One Go startup guard | | M6 (lint errors) | Medium | Mistral | Auto-fix pass + manual cleanup | | L1 (deployment defaults) | Low | Mistral | Replace hardcoded strings | | L2 (MIME hardening) | Low | Mistral | Reuse existing magic-byte validator | | M1 (ignoreBuildErrors) | Medium | Mistral | Config change + TS cleanup | ## Workflow Phase Design ### Phase 1 — Haiku (parallel) Two agents run simultaneously: **H1-fix**: `tenantBotService.ts` - Create `toPublicBotList()` — identical to `toPublicBot()` but always returns `claimUrl: null` - Replace usage in the list/map path with the new function - Keep `toPublicBot()` for the dedicated claim-link endpoint **C1-doc**: Write `C1-Secrets-Rotation-Checklist-2026-06-10.md` - Rotation steps per category (env files, test fixtures, docs) - History cleanup instructions (git filter-repo, coordinate clones) - Prevention checklist (gitleaks hook, CI scan) ### Phase 2 — Sonnet (parallel, non-overlapping files) Three agents run simultaneously: **C2-fix**: `frontend/src/app/api/llm/route.ts` + `amanat-assist/llm-proxy/index.mjs` - Add session/JWT auth check to the Next.js route (401 if not authenticated) - Add 64KB body size guard to route - Flip CORS default from wildcard to closed in proxy - Add 256KB body cap to proxy - Restrict provider to ALLOWED_PROVIDERS env var - Redact error logging (status + truncated message only) **H2-fix**: `backend/src/services/file/fileController.ts` + `fileRoutes.ts` - Read ownership model from upload code to understand user → file path mapping - Add ownership check before delete: file must belong to user or user must be admin - Add ownership check before info: same rule - Return 403 on unauthorized access **Payment-fix** (H3 + H4 + M3 combined — single agent to avoid same-file conflicts): - H3: Remove `ORACLE_QUOTING_ENABLED` flag-gated fallback; always use server-side oracle path; fail 422 if offer not loadable - H4: Replace raw `payment.buyerId !== userId.toString()` comparisons with canonical helper that checks both legacy ObjectId and pgId UUID (3 sites in `requestNetworkRoutes.ts` + 3 in `paymentRoutes.ts`) - M3: Add buyer ownership check to permit relay route; add in-memory rate limiter (5 relay attempts/payment/minute) ### Phase 3 — Haiku (parallel verification) - `cd backend && npx tsc --noEmit -p tsconfig.json` — report pass/fail + errors - `cd scanner && go build ./...` — report pass/fail ### Phase 4 — Opus (final review) Read all 6 changed files, assess: - Is each fix correct and complete? - Are there bypass vectors? - Regressions in legitimate flows? - TypeScript type safety? Return a structured PASS/NEEDS_FIX verdict per file + overall READY/NEEDS_WORK. ## Findings NOT covered by this workflow (human action required) - **C1 rotation**: The checklist is generated, but actual key rotation is a human action (BotFather, provider dashboards, re-deployment with new values, then git history rewrite after rotation confirmed). - **H5 dependencies**: Upgrade lockfiles needs careful testing — separate controlled branch recommended. - **M2 browser tokens**: Moving to httpOnly cookies is a large auth refactor — tracked as a separate initiative. ## Estimated output - ~6 file edits across frontend, backend, amanat-assist - 1 new doc (C1 rotation checklist) - Typecheck passes expected (Opus review will catch regressions if any) - Backend tsc was already passing before this workflow — must stay passing