Files
microfish/docs/engineering-log.md
Kunthawat Greethong 8b84378fe1 feat: SaaS foundation for CrowdSight
Elevate MiroFish/CrowdSight from single-container dev to a SaaS foundation:

- Local memory backend (Zep-compatible): memory services/models, local graph
  builder + updater, AgentActivity seam, import-boundary isolation; Zep stays
  default, local is opt-in behind MEMORY_BACKEND. Semantic parity not yet proven.
- Durable product persistence: projects/simulations/reports schema (migration
  0007) + tenant/owner-scoped ProductRepository + dual-write + scoped_project
  read-first + ArtifactStore abstraction; durable JobQueue + worker.py.
- SaaS hardening: durable RateLimiter (wired to login), UsageService (LLM
  accounting), redacted AuditService, idempotency, CORS allowlist, safe API
  errors, single-use PasswordResetService + endpoints (covers invite-pending).
- Exactly 3 roles (super_admin/admin/user) with tenant authz policy.
- Admin UI: GET/POST/PATCH /api/admin/users + GET/PUT /api/admin/settings
  (super-admin only, encrypted/masked); AdminView.vue + SettingsView.vue with
  admin/super-admin route guards, th/en i18n.
- Production deploy topology: multi-stage Dockerfile (frontend build + gunicorn
  wsgi + nginx SPA-proxy + supervisord worker), backend/wsgi.py, gunicorn dep.

Backend 197 passed; frontend 10 tests + build green. ruff unavailable (gap).
No commit of credentials; secrets handled via env/.env.example.
Deferred: Zep semantic A/B parity, object storage cutover, mobile QA, EasyPanel
container build of deploy topology.
2026-08-31 13:05:21 +07:00

4.9 KiB
Raw Blame History

Engineering Log

Current status

Milestone Status Last verified Evidence Next action
Baseline architecture study complete 2026-08-23 npm run build passed; compileall passed; git diff --check passed; source inventory completed Review MiroFish SaaS plan and lock M0 decisions
Thai/English frontend hardening bounded active-surface gate 2026-08-24 Frontend contract tests 10 passed; production build passed; active routed UI has no hardcoded CJK visible strings; legacy unused Process.vue (Chinese copy) retired — router uses MainView.vue; mobile viewport capture not yet verified Migrate remaining legacy views and perform real 320×568 and 500×768 capture when browser permission is available
Zep replacement bounded local E2E slice 2026-08-24 Local graph → profile → simulation config → report tools → persisted report regression passed; default remains Zep; no full consumer cutover or semantic parity claim Cut over remaining consumers and close semantic/E2E gaps
Auth/tenant/roles bounded foundation 2026-08-24 Identity/session/roles/CSRF/CORS/idempotency/resource guards covered by focused tests; durable task app-state leak fixed; task query filters now push tenant predicates into SQL Complete broader tenant matrix, admin UI, rate limits, audit/usage policy
SaaS foundation batch in progress 2026-08-24 Backend full suite 193 passed after app/factory isolation, SQLite-FK, auxiliary API auth/CSRF/idempotency, cross-route/multipart idempotency, local consumer-boundary fixes, durable product-resource schema/repository, tenant-scoped ArtifactStore, durable JobQueue+worker.py, versioned redacted PlatformSettings, durable RateLimiter (wired to login), durable LLM UsageService, durable redacted AuditService, and durable single-use PasswordResetService + endpoints (also covers invite-pending setup); schema/TaskManager regression 16 passed; auxiliary security 8 passed; idempotency API 5 passed; local import-boundary regression 9 fresh-import tests; product-resource persistence 21 tests; artifact store 12 tests; job queue/worker 10 tests; settings service 4 tests; rate limiter 6 tests; usage service 4 tests; audit service 3 tests; password reset 6 tests; frontend gates passed; bounded reviewers passed their exact slices; hardened bases ready; remaining: resource authz matrix completion, admin/bootstrap UI, and deploy topology; ruff unavailable; no commit/push/deploy Complete admin UI, authz matrix, then deploy topology; do not claim full-system approval
Admin/super-admin UI bounded foundation 2026-08-24 Backend: GET/POST/PATCH /api/admin/users + GET/PUT /api/admin/settings (super-admin only, masked/encrypted secret via SettingsService); Frontend: AdminView.vue (user mgmt) + SettingsView.vue (LLM settings form) routed at /admin + /admin/settings with admin/super-admin role guards, th/en i18n identical; build + 10 frontend tests pass; backend 197 passed Add invite self-setup UX, connection-test endpoint, then full i18n/mobile review
Production worker/deployment production topology drafted, locally smoke-tested 2026-08-24 Dockerfile rebuilt as multi-stage production (frontend build + python-gunicorn + nginx-SPA-proxy + supervisord worker); backend/wsgi.py gunicorn entry + gunicorn>=21 added; local smoke test: gunicorn wsgi:app started, /health OK, /api/auth/login 401, built SPA assets served 200; backend 197 passed Build in EasyPanel container to verify nginx SPA-fallback + /api proxy + worker poll; choose broker (Redis vs durable-poll) + object storage for full readiness

Guardrails

  • No production implementation was changed during the architecture study.
  • Keep exactly three role identifiers: super_admin, admin, user.
  • Never expose LLM/API secrets to the browser or commit them to docs/logs.
  • Backend authorization and tenant scope are authoritative; frontend visibility is not security.
  • Do not claim LLM/Zep semantic parity without golden-fixture evidence.

Entry index

  • docs/engineering-log/2026-08-23-architecture-study.md
  • docs/test-evidence/2026-08-23-baseline.md
  • .hermes/plans/2026-08-23_110451-mirofish-saas-migration.md
  • docs/engineering-log/2026-08-24-simulation-memory-fallback.md
  • Independent SaaS audit findings were incorporated after the initial plan: raw log redaction, ID/path confinement, idempotency, upload drafts and API contract tests.
  • Safe-error audit now covers API response/persisted task state paths; raw exception/traceback values are replaced with generic localized errors and error-type-only server logs.
  • docs/engineering-log/2026-08-24-memory-parity-panorama-insight.md records the bounded parity implementation, verification evidence, review verdict, and remaining semantic/E2E boundary.
  • docs/engineering-log/2026-08-24-saas-foundation-verification.md