think
16px
820px

Plan — console self-service + accounts + triage (2026-07-08)

TDD per task; commit per task; mirrors byte-identical. Spec:
specs/2026-07-08-console-selfservice-accounts-design.md.

Order (smallest → largest, then triage):

T1 #3 Schema browser (internal-web)

  • [ ] lib/schema/filter.ts filterTables + tests (case-insensitive substring, empty q = all)
  • [ ] /admin/internal/schema page (DB select → tables + search + count) + AdminRail "Skema DB"

T2 #2a Public persona (public-web + internal-web config copies)

  • [ ] persona_preamble in both Config stores (default "", clamp ≤4000) + tests
  • [ ] compose prepends persona; orchestrate passes cfg value + tests
  • [ ] /admin/public/persona page (GET/PUT via /api/admin/orchestrator) + AdminRail

T3 #2b Agent persona (agents ×2 + internal-web)

  • [ ] dash/persona.py load_persona() + file-path tests (missing/invalid/valid, cap)
  • [ ] agents.py prepends persona; app/persona_admin.py GET/PUT + hot-swap; register in main.py ×2
  • [ ] compose: named …-agent-data:/data volumes for both agents
  • [ ] internal-web /api/admin/agent-persona proxy (PUT guarded+audited) + /admin/internal/persona page + AdminRail

T4 #5 Per-account history (public-web)

  • [ ] lib/threads/store.ts ThreadStore + tests (upsert, append, list-by-email, get-owned, title cap)
  • [ ] orchestrate route tee (Akun cookie → persist on done; fire-and-forget) + tests (mock runOrchestrator)
  • [ ] /api/threads/doc + /[id] Akun branch + tests; sidebar keeps same client contract

T5 #8 Password lifecycle

  • [ ] PublicUserStore.resetPassword (tv++) + tests
  • [ ] POST /api/auth/change-password + cookie re-issue + tests; sidebar "Ubah kata sandi" dialog
  • [ ] internal-web PublicAccountAdminStore + /api/admin/public-users (+[id] PATCH reset/disable/enable, guarded+audited) + tests + /admin/shared/public-users page + AdminRail

T6 #7 Vuln triage

  • [ ] pnpm audit workspace: fix crit/high via bumps/overrides; suites stay green
  • [ ] pip-audit both agents' requirements: bump compatible pins; in-image pytest gate at ship
  • [ ] Record remaining/deferred in completion notes

T7 Verify + ship

  • [ ] pnpm check + agent pytest (pinned venv) + mirrors diff
  • [ ] build-and-ship → deploy-staging → live smoke (schema page, persona PUT→answer changes, history after Akun chat, change-password, admin reset)
  • [ ] ROADMAP restructure (#1 #4 #6 = Next up; built items marked DONE), completion notes, upload, push