CHANGELOG.md di repo. Pakai filter di bawah untuk cari fitur tertentu.Filter
Cari fitur / fix
48 dari 48 rilis ditampilkan
2026-06-08
UnreleasedBug fix: edit existing project metadata
Project yang sudah ada gak bisa update field baru (projectKind, technologies, githubRepoUrl, githubDefaultBranch). Tombol '✎ Edit metadata' di Selected card + modal reuse create dengan form prefilled. Backend updateProject extend handle name/clientId/ownerId/description.
- Frontend: tombol Edit metadata di Selected project card. State editingId di /projects. Reuse create modal dengan title/button label switch (New/Edit). Submit handler conditional POST vs PATCH.
- Backend updateProject: tambah handler name (trim wajib), clientId, ownerId, description. Empty string → null, undefined → no change.
2026-06-08
UnreleasedSprint U: UAT doc extend (P9-P12)
Extend docs/UAT-KAIMO.md dengan P9 M9 Training (13 TC), P10 M10 Manual Book (10 TC), P11 M11 v2 ChangeEvent (7 TC), P12 GitHub Integration (12 TC). Total 42 baru. Status M1-M11 update jadi 100% coverage.
- P9 Training Engine: setup + generate (5 kind template) + section regen (M3 pattern + diff preview) + export DOCX + lifecycle DRAFT→APPROVED→ARCHIVED.
- P10 Manual Book Engine: setup + kind-specific source filter (FAQ→OPEN_QUESTION+DECISION, TROUBLESHOOTING→ISSUE+RISK) + publish lifecycle.
- P11 M11 v2 ChangeEvent: auto-log dari BRD/FSD section + Requirement update + KO approve. Acknowledge flow + Assistant integration warn.
- P12 GitHub: binding setup public/private + GITHUB_TOKEN env + Alignment Phase 1-3 + Delivery Score caching + cross-project dashboard card.
2026-06-08
UnreleasedSprint V: ChangeEvent extend ke Requirement+KO + Assistant integration
ChangeEvent sekarang juga di-log dari RequirementsService.update (status/content) + KnowledgeObjectService.approve. Assistant context include unacked events — AI bisa proactively warn user tentang upstream changes yang belum di-review.
- RequirementsService.update log ChangeEvent: STATUS_CHANGED untuk transition status, CONTENT_UPDATED untuk title/description change. Snapshot first 300 char description.
- KnowledgeObjectService.approve log ChangeEvent STATUS_CHANGED (kalau KO ada projectId — global KO gak track).
- buildOperationalContext paralel fetch unackedChangeEvents top 8. Snippets section dengan AI instruksi untuk warn user kalau ada upstream perubahan belum acknowledged.
2026-06-08
UnreleasedSprint W: Sentry-lite FE error reporting
ErrorBoundary sekarang auto-POST crash detail ke backend (audit log action fe-error.boundary). Retention cron preserve fe-error. prefix supaya forensics jangka panjang aman. No SDK dep — pakai existing audit log infrastructure.
- Backend POST /audit-logs/fe-error (permission audit-logs:read) → recordFrontendError capture message/stack/componentStack/url/userAgent, linked ke actor.
- AUDIT_RETENTION_PRESERVE_PREFIXES tambah 'fe-error.' — gak ke-purge 90-day retention.
- FE ErrorBoundary componentDidCatch auto-POST. Fire-and-forget — gagal report gak crash UI.
2026-06-08
UnreleasedSprint X+Y+Z: M11 v2 ChangeEvent + Print CSS + ManualBook tests
X: @media print rules supaya Ctrl+P export ke PDF langsung (gak butuh lib). Y: ChangeEvent model + auto-log saat BRD/FSD section regen + UI di /impact tab dengan acknowledge flow. Z: 8 test cases untuk ManualBook helpers (all pass).
- @media print CSS: hide nav/topbar/modal/buttons + strip panel styling + page-break rules. Ctrl+P → 'Save as PDF' clean output tanpa lib tambahan.
- ErrorBoundary wrap Alignment Report di /projects/[id]/github.
- M11 v2 ChangeEvent: schema (entityType BRD_SECTION/FSD_SECTION/REQUIREMENT/KO + action CONTENT_UPDATED/STATUS_CHANGED/REGENERATED) + ImpactService.logChangeEvent/listChangeEvents/acknowledgeChangeEvent + 2 endpoints.
- BrdService + FsdService regenerateSection auto-log ChangeEvent (fire-and-forget).
- /projects/[id]/impact section '🔔 Change Events' dengan filter acknowledged + Acknowledge button per event.
- Tests: 8 cases untuk ManualBook defaultTitle + templateChapterTitles (all pass).
2026-06-08
UnreleasedPhase C — Production Ready: ErrorBoundary + Skeleton + 16 tests
Generic ErrorBoundary component (class) — supaya 1 component crash gak kill seluruh page. Skeleton + SkeletonTable dengan shimmer animation (replace plain 'Memuat…' di Training+Manual list). 16 Jest tests untuk GitHub alignment matching (parseRepoSpec/tokenize/matchesAnchor/fuzzyMatch) — all pass.
- apps/web/src/components/ErrorBoundary.tsx — class component dengan getDerivedStateFromError + reset button. Sentry integration defer.
- apps/web/src/components/Skeleton.tsx — Skeleton/SkeletonRow/SkeletonTable dengan @keyframes skeleton-shimmer. Apply ke Training + Manual list (replace plain 'Memuat…').
- Export tokenize/matchesAnchor/fuzzyMatch dari github.service.ts untuk testability.
- apps/api/test/github-alignment.spec.ts — 16 test cases (parseRepoSpec short+URL+.git+trailing+invalid, tokenize id+en stop+special chars, matchesAnchor canonicalId+REQ, fuzzyMatch ≥60%+edge). All pass via pnpm test.
2026-06-08
UnreleasedPhase B — M10 Manual Book Engine v1 (close major brief module)
Pattern paralel dengan M9 Training. 5 kind (USER_GUIDE/FAQ/TROUBLESHOOTING/ADMIN_GUIDE/GLOSSARY) × chapter list × per-kind template prompt. Tab '📘 Manual' di ProjectSubNav.
- Schema: ManualBookKind enum, ManualBookStatus enum, ManualBook + ManualBookChapter model. Migration 20260608160000_add_manual_book.
- Permissions manual-book:read + manual-book:manage di packages/shared.
- Backend apps/api/src/manual-book/: list/getById/create/generateChapters (paralel AI per template + kind-specific source filter: FAQ pakai OPEN_QUESTION+DECISION, TROUBLESHOOTING pakai ISSUE+RISK)/regenerateChapter (M3 + preview)/updateChapter/updateBook. 7 endpoints.
- Frontend: tab '📘 Manual', list + detail page dengan generate, per-chapter approve, Publish (PUBLISHED), Archive, Export DOCX, per-chapter regen via DocumentRegenSelection.
2026-06-08
UnreleasedPhase A — Training v2 section regen + cross-project Delivery dashboard
A.1: M9 Training section regen via DocumentRegenSelection (highlight → diff preview → approve, pattern M3). A.2: Dashboard / card '🐙 Butuh perhatian' — list project bound GitHub dengan score <80%, sorted terendah dulu.
- Backend POST /training-materials/sections/:sectionId/regenerate dengan preview flag. APPROVED section auto-reset DRAFT setelah regen.
- FE Training detail wrap section dengan DocumentRegenSelection (data-doc-block-id=section.id). Disabled saat doc bukan DRAFT.
- Dashboard deriva deliveryAttention: project bound GitHub + score <80%, sorted ASC. Conditional card dengan score badge + link langsung ke /projects/:id/github.
2026-06-08
UnreleasedSprint 4 — Mobile responsive + A11y polish
@media max-width 640px stack grid 2-col, modal 96vw, table horizontal scroll, section heading wrap, SubNav compact. :focus-visible outline 2px teal untuk keyboard nav. .sr-only utility.
- @media (max-width: 640px): stack .grid.cols-2/cols-3 vertikal, .modal full-screen-ish (96vw), .table-wrap overflow-x + min-width 600px, .section-heading stack, app-shell-content compact padding, SubNav tab font 12px.
- :focus-visible outline 2px teal di button/a/input/select/textarea.
- .sr-only utility untuk screen reader content.
2026-06-08
UnreleasedSprint 3 — M9 Training Engine v1
Implementasi M9 Training Engine sesuai roadmap. Scope minimal: full CRUD + AI generate per kind template + per-section approve + DOCX export. ProjectSubNav tab '🎓 Training'.
- Schema: TrainingMaterialKind enum (OUTLINE/DEMO_FLOW/SLIDE_DRAFT/EXERCISE/REFERENCE), TrainingMaterialStatus enum, TrainingMaterial + TrainingMaterialSection model. Migration 20260608150000_add_training_engine.
- Permissions training:read + training:manage di packages/shared.
- Backend apps/api/src/training/: list (kind/module/status filter), getById, create (FSD APPROVED + same project validation), generateSections (template per kind via AI + FSD context), updateSection, updateMaterial. 6 endpoints.
- Frontend: tab '🎓 Training' di ProjectSubNav. List page /projects/[id]/training dengan filter kind + status + +New modal (module + kind + title + audience + durasi + FSD source dropdown APPROVED only).
- Detail page /projects/[id]/training/[materialId]: generate button, per-section approve/unapprove, Mark Training as APPROVED kalau all section approved, Archive, Export DOCX (reuse generic builder).
2026-06-08
UnreleasedSprint 2 — Assistant injection delivery score
Extend buildOperationalContext: project snapshot tambah githubRepoUrl + cached delivery score. Conditional warning kalau score <80% — AI dapat instruksi rekomendasi user buka Run analysis + ingatkan dev cantum REQ-NNN di commit.
- Project snapshot tambah githubRepoUrl line + lastAlignmentScore + lastAlignmentAt lines.
- Conditional warning section: kalau bound ke GitHub + score <80%, push instruksi ke AI.
2026-06-08
UnreleasedSprint 1 — Delivery Score cache + daily cron + project list badge
Cache delivery score di Project supaya project list bisa tampil cross-project tanpa fetch GitHub ulang. Daily cron auto-refresh. DeliveryScoreBadge di card + table view.
- Schema: Project.lastAlignmentScore Int? + lastAlignmentAt DateTime?. Migration 20260608140000_add_project_alignment_cache (additif nullable).
- Backend: getAlignment fire-and-forget cache update setiap run. Queue GITHUB_ALIGNMENT_REFRESH_QUEUE + scheduleGitHubAlignmentRefresh() interval 24h. Worker loop semua project bound, log success/failure per project.
- Frontend: DeliveryScoreBadge dengan threshold (≥80 hijau, ≥50 amber, <50 merah) + stale indicator (>24h ⚠). Tampil di project card + table view kolom baru 'Delivery'.
2026-06-08
UnreleasedAlignment Phase 3 — BRD/FSD coverage + Delivery Score
Extend alignment report dengan BRD/FSD APPROVED coverage. Delivery Score 0-100% (matched/total dari Task + REQ + BRD + FSD) dengan threshold visual 80%+ hijau, 50-79% amber, <50% merah. UI panel ringkas + 4 stats badge sejajar + section BRD/FSD list dengan badge ✓/⚠.
- Backend getAlignment: paralel fetch BRD APPROVED top 50 + FSD APPROVED top 50 (per module).
- BRD match: fuzzy title token vs commit/PR. FSD match: module name substring (anchor) + fuzzy title compound (gak false positive).
- Delivery Score 0-100% di response + UI big number card dengan tagline ('✓ mayoritas' / '⚠ beberapa perlu cantum' / '⚠ banyak belum trace').
- UI stats: 4 badge sejajar Tasks N/M + Requirements N/M + BRD N/M + FSD N/M.
- UI section: BRD APPROVED list + FSD APPROVED list (module — title — vN) dengan badge ✓ matched / ⚠ unmatched + hint per item.
2026-06-08
UnreleasedDOCX export BRD/FSD (close backlog)
Close 1 backlog item (estimasi 5-6 jam, selesai jauh lebih cepat dengan reuse helper MoM v2). Tombol 'Export DOCX' di BRD/FSD detail. FE-only — gak butuh lib backend.
- Generic DOCX builder apps/web/src/features/document-export/docxBuilder.ts — reuse helper (createZip, docxParagraph, docxNativeNumbered, docxNativeBullet, buildNumberingXml) dari MoM v2.
- Auto-detect prefix per line: '1.'/'2)' → numbered list, '-'/'*'/'•' → bullet, else → justified paragraph.
- Cover page: KAITECH header + title + project + module + meta (status/version/createdBy/generatedAt). Per section: heading + status badge + content.
- FE tombol 'Export DOCX' di BRD + FSD detail. Filename BRD-{title}-v{N}.docx atau FSD-{module}-{title}-v{N}.docx.
2026-06-08
UnreleasedAudit log retention job (cron 24h)
Close 1 long-term audit finding: DB grow tak terbatas. BullMQ scheduled worker purge audit log >90 hari, kecuali action prefix auth./users./settings. (security-relevant preserved).
- Queue AUDIT_LOG_RETENTION_QUEUE + scheduleAuditRetention() — interval 24 jam, idempotent.
- Worker auditRetentionWorker — deleteMany dengan filter createdAt < cutoff AND action NOT startsWith preserved prefix.
- Constant AUDIT_RETENTION_DAYS=90 + AUDIT_RETENTION_PRESERVE_PREFIXES=['auth.', 'users.', 'settings.']
- Auto-schedule saat worker bootstrap.
2026-06-08
UnreleasedGitHub Alignment Report (Phase 2)
Cross-verify Task COMMITTED + Requirement ACTIVE vs commit/PR di repo. Per task match via canonicalId / REQ-NNN code / fuzzy title (≥60% kata). Per requirement match REQ-NNN substring. Unmatched item kasih hint untuk dev cantum REQ di commit message.
- Backend GitHubService.getAlignment(projectId) — paralel fetch repo overview + Task COMMITTED top 100 + Requirement ACTIVE top 100. Helpers tokenize + matchesAnchor + fuzzyMatch dengan stop words id+en.
- Endpoint GET /projects/:projectId/github/alignment (permission projects:read).
- Frontend Alignment Report section di GitHub sub-page: Run analysis button, stats badge tasks/requirements matched, per item dengan matched commit/PR (top 3 + more) atau hint kalau unmatched.
2026-06-08
UnreleasedGitHub binding per project + user reactivate
Project bind ke GitHub repo (owner/repo atau URL). Sub-page /projects/[id]/github tampilkan top 20 commit + open PR + open issue dari GitHub REST API. Tujuan: verify delivery (commit message, PR title) vs MoM/BRD/FSD/Task. User Management dapat tombol Reactivate untuk SUSPENDED user.
- Schema: Project.githubRepoUrl String? + Project.githubDefaultBranch String?. Migration 20260608130000_add_project_github (additif nullable).
- Backend: apps/api/src/github/ service + controller. GitHubService.parseRepoSpec() terima short form atau URL. getOverview() fetch repo metadata + top 20 commits + open PR + open issue. Optional GITHUB_TOKEN env untuk private repo. 15s timeout + error mapping 404/401/403.
- Endpoint GET /projects/:projectId/github/overview (permission projects:read).
- Project create modal: input GitHub Repo + Default branch.
- Sub-page /projects/[id]/github + tab '🐙 GitHub' di ProjectSubNav: panel ringkas (stats) + table commits + list open PR + list open issue. Refresh button + open di GitHub.
- User lifecycle: POST /users/:id/reactivate. Settings → Access table button toggle Active=Deactivate, Suspended=Reactivate.
2026-06-08
UnreleasedAudit follow-up: suspended user filter + channel idempotency + req pagination
Address 3 audit findings: suspended user filter di dropdown (security), channel webhook idempotency via externalMessageId unique key (reliability), Requirement list pagination + case-insensitive filter (perf).
- Security: SUSPENDED user gak muncul di assignee dropdown (tickets, projects, crm). listUsers() default exclude SUSPENDED, Settings page pakai ?includeSuspended=true.
- Reliability: channel webhook idempotency. Tambah KnowledgeNote.externalMessageId + unique (projectId, sourceType, externalMessageId). Replay webhook → skip insert. Migration 20260608120000_add_external_message_id (additif nullable).
- Perf: Requirement list take=500 cap + module filter case-insensitive (konsisten dengan FSD N6 fix).
2026-06-08
UnreleasedUAT Batch 1 + M3 diff preview + Audit perf/sec
UAT findings batch 1 fixed (K5/N6/J7/L16/D4/Task COMMITTED/M3 diff preview). Link KO via UI di Requirement detail modal. User Management admin (reset password + soft suspend). Roadmap M9 Training + M10 Manual Book di docs. Audit perf/sec — closed FileInterceptor size limit DOS risk.
- K5: Knowledge Hub filter by module (dropdown + filter logic per group)
- N6: FSD filter module case-insensitive (Prisma equals mode:insensitive)
- J7: Timeline citation clickable (anchor → /mom?recordingId, /knowledge?noteId, /projects/:id/knowledge-hub, /foundation?tab=authority)
- L16: tombol 'Mark APPROVED' eksplisit → 'Mark BRD/FSD as APPROVED'
- Task COMMITTED: Requirement link tetap bisa di-update via endpoint baru PATCH /mom/task-drafts/:sessionId/items/:itemId/requirement
- D4: UAT doc rename 'Existing Materials tab' → 'tab Files'
- M3 Regen Reusable: diff preview modal sebelum save (RegenDiffModal side-by-side Sebelum/Sesudah, 3 actions Cancel/Edit lagi/Approve). Backend tambah preview flag di requirements/brd/fsd regen service.
- Link KO via UI di Requirement detail modal: dropdown KO APPROVED + Link button + unlink (✕) per source KO. Replace placeholder endpoint manual.
- Settings → Access: PATCH /users/:id/password (reset) + DELETE /users/:id (soft suspend). UI Reset password + Deactivate button + status badge per user row. Self-deactivate dicegah.
- Roadmap docs M9 Training Engine (~25-35 jam) + M10 Manual Book (~25-35 jam) di docs/ROADMAP-M9-M10.md — full schema + endpoints + frontend plan + estimasi breakdown.
- Audit doc docs/AUDIT-PERF-SECURITY-2026-06-08.md (status aman + 8 open findings).
- Security: FileInterceptor tanpa size limit di 4 controller (DOS risk) — tambah limits 200 MB (project files), 500 MB (MoM recording desktop + web), 100 MB (knowledge doc).
2026-06-08
UnreleasedBreadcrumb fix + MoM tab di ProjectSubNav
Bug fix: breadcrumb tampil project.code (PRJ-0005) bukan UUID slice. MoM tab di-restore di ProjectSubNav setelah Sprint DD drop MoM project list — link ke /mom?projectId=X dengan auto-init.
- ProjectBreadcrumb wrapper auto-fetch /projects/:id (cache Map) untuk render real project.code (PRJ-0005) ganti projectId.slice(0,8).
- MoM tab hilang dari ProjectSubNav setelah Sprint DD drop MoM list di /projects. Tambah MoM tab → in-project sub-page /projects/[id]/mom (bukan redirect external).
- MoM sub-page baru: list recording scoped project + filter status/keyword + 'Upload MoM' CTA → /mom global. Click recording → /mom?recordingId=X open detail.
- Build fix /changelog: type error kind 'removed' gak match ChangeKind union. Tambah 'removed' ke union + label + badge merah (Keep a Changelog standard).
2026-06-08
UnreleasedChannel Media Download Pipeline (WA + Email)
Close 1 backlog item (~3-4 jam). Attachment dari WA/Email sekarang download ke MinIO + ingest ke RAG (Whisper audio, OCR image, PDF text). Sebelumnya cuma URL list di content text.
- Queue CHANNEL_MEDIA_QUEUE + addChannelMediaJob() helper. Payload: {noteId, projectId, url, filename, mimeType?, source: WHATSAPP | EMAIL}.
- channel-media.service.ts (NEW): processJob() dengan AbortController 60s timeout + MAX_FILE_SIZE 50MB cap. Fetch URL → buffer → MinIO → KnowledgeDocument + KnowledgeNoteAttachment → trigger addKnowledgeJob.
- channel-ingest.service.ts: persistMessage accept mediaSources[]. WA caller map body.mediaUrls, Email caller map body.attachments. Helper deriveFilenameFromUrl.
- Worker: channelMediaWorker dengan 3 attempts exponential backoff.
2026-06-04
UnreleasedSprint EE + FF — MoM v2 UX Overhaul + Assistant Project Brain v1
Sprint EE: diff preview modal sebelum save regen + allow multi-paragraph & empty + drop Exec Summary preview + collapsible KO/Attachment. Sprint FF: Assistant extend context dengan BRD/FSD/Req/KO/QA/UAT/Channel — Project Brain v1.
- MomV2RegenDiffModal (NEW): side-by-side panel Sebelum (red) | Sesudah (green). 3 actions: Cancel / Edit lagi (prefilled) / Approve & save. Dynamic 'Confirm hapus blok' kalau regenerated empty.
- Backend mom.service.ts regenerateMomV1Item accept preview?: boolean. Preview=true: early return {preview, newText, ...} tanpa persist. Preview=false + manualReplacement: persist.
- Assistant buildOperationalContext extend Promise.all: BRD APPROVED top 3, FSD APPROVED top 5, Requirements ACTIVE top 10 (REQ-NNN), KO APPROVED top 10, QA groupBy status, UAT scenario groupBy, ProjectChannelBinding active.
- Format snippets sebagai cite-able untuk AI cross-reference (BRD section, REQ-NNN, KO id).
- MomV2RegenSelection: manual mode allow empty string (typeof === 'string' check, bukan .trim()). Textarea rows={6} ganti single-line. aiOutput default ''.
- MomV2Panel drop <MomV2ExecutiveSummary> render dari preview. DOCX template tetap include (logic terpisah).
- MomV2KOSection + MomV2EvidenceSection wrap dengan <details className='panel collapsible-panel'> + <summary>. Default collapsed (count badge only). Reduce visual length 400-600px → ~80px per section.
2026-06-04
UnreleasedSprint AA + BB + CC + DD — Dashboard + Breadcrumb + Project Overhaul
4 sprints batch: dashboard cleanup (drop ticket/health), breadcrumb component + 12 sub-page, ProjectKind+technologies schema, project page filter functional + view toggle + pagination + drop redundant sections.
- [AA] Dashboard mini-hero compact 'Delivery Knowledge OS' + 3 KPI inline (project aktif, BRD pending, MoM bulan ini). Active Projects mini-list 5 latest dengan health pill + quick link foundation.
- [BB] Breadcrumb component (NEW): semantic <nav aria-label> + <ol> + aria-current='page'. Applied ke 12 project sub-page.
- [CC] Schema: ProjectKind enum (ODOO/GENERIC) + Project.technologies String? — additif, default GENERIC backward-compat. createProject + updateProject accept new fields.
- [CC] Create modal: radio tile Odoo/Custom + Tech Stack text input (placeholder 'Odoo 17, PostgreSQL, Python, React').
- [DD] Filter functional bar: keyword + Status dropdown + Health dropdown.
- [DD] Toggle Card/Table view dengan localStorage persist (kaitech.projectsView). Table compact 7 kolom.
- [DD] Pagination 10/page, auto-hide kalau total ≤ 10.
- [DD] ProjectKind pill + Technologies tags badge di card.
- [AA] Command Center hero, KPI Total tiket + Open tickets, Block Area, System Health, Ticket Radar — Kaimo pivot fokus delivery, ticket hidden.
- [DD] 'Update project aktif' panel (sudah ada di /projects/[id]/foundation lebih lengkap).
- [DD] 'MoM project' list (akses MoM via ProjectSubNav → MoM tab dengan ?projectId=).
- Why ProjectKind+technologies: foundation Assistant Project Brain cari 'solusi dari bahan klien' via RAG matching cross-project (project lain dengan tech overlap → suggest BRD/FSD/KO relevan).
- Quick Actions dashboard updated: Projects, MoM, Members, Assistant, Knowledge/RAG (drop Triage tiket).
2026-06-03
Unreleased/profile self-manage + Account bug fix + Sticky SubNav
/profile page baru (edit name + change password + view assignments). Account info bug (sidebar + topbar tampil hardcoded user) fix dengan baca /auth/me real-time. SubNav unified sticky dengan topbar (top: 64px, z-index hierarchy).
- /profile page: edit name (PATCH /users/me), change password (current + new + confirm), view project assignments read-only dengan role per project.
- Sidebar user-card + topbar userchip show real name + email dari auth context.
- Account info bug — sidebar dan topbar tadinya hardcoded user. Sekarang baca dari /auth/me real-time.
- Sticky SubNav overlapping content — position: sticky; top: 64px (matches topbar height), z-index: 20, fully opaque white + box-shadow. Topbar juga sticky top: 0; z-index: 25. Unified sticky header.
- SubNav covered by topbar at certain scroll: opacity fix + z-index hierarchy.
2026-06-03
UnreleasedChannel Ingestion (WA + Email) + RAG Viewer
Webhook endpoint /channels/whatsapp + /channels/email untuk ingest message → KnowledgeNote per project. ProjectChannelBinding mapping. /knowledge RAG viewer dengan filter project/folder/scope + overview cards.
- ProjectChannelBinding model: channel type (WHATSAPP/EMAIL) + identifier per project.
- Webhook /channels/whatsapp + /channels/email dengan header auth x-kaitech-webhook-key.
- channel-ingest.service.ts persistMessage create KnowledgeNote + trigger RAG ingestion via knowledge job queue.
- n8n runbook docs untuk channel ingest webhook setup.
- /knowledge page: filter project + folder + scope. Overview cards: total document, total chunk, last ingestion. Table list dengan source, type, status, chunk count.
2026-06-02
UnreleasedTest fix + UAT extend + n8n runbook
Pre-existing test fail di operations.spec.ts (mock alignment). UAT scenario extend untuk M2/M4/M6/M7/M8. n8n runbook untuk channel ingest setup.
- Pre-existing test fail di apps/api/test/operations.spec.ts (mock alignment).
- UAT scenario extend cover M2 (BRD) + M4 (FSD) + M6 (Traceability) + M7 (QA) + M8 (UAT).
- n8n runbook untuk channel ingest webhook setup di docs.
2026-06-02
UnreleasedDashboard Module Cards + Project Slim + Files Sub-Page + ProjectSubNav
Dashboard tambah module summary cards (BRD/FSD/QA/UAT) dengan progress. Project page slim cards 96px (dari 360-520px) — drop Drive + Assistant inline. New /projects/[id]/files sub-page. ProjectSubNav reusable tab bar ke 11 sub-page. Sidebar Ticket hidden (Kaimo pivot).
- Dashboard module summary cards (BRD/FSD/QA/UAT) per modul: total + pending review + completion %. Click navigate ke module page.
- /projects/[id]/files sub-page: ProjectFile list (filter category) + MoM recordings linked ke project. Open in Lark external link.
- ProjectSubNav reusable tab bar component: sticky horizontal pill tabs, applied ke 11 project sub-page.
- prisma:sync-permissions script untuk maintain role/permission seeding.
- Project page slim: cards 96px (dari 360-520px). Drop Drive section + Assistant inline (sudah ada di sub-tab).
- Sidebar Ticket + CRM link hidden (Kaimo pivot fokus delivery).
2026-06-01
UnreleasedSprint M2 + M4 + M7 + M8 Parallel Burst (+ M3 + M11 v1 + M6)
Big parallel sprint burst: M2 BRD Workspace, M4 FSD Workspace, M7 QA Engine, M8 UAT Engine v1. Plus M3 generic doc regen, M11 v1 Impact Engine (KO+Req dependency map), M6 Development Traceability (Task → Req link).
- [M2] BRD model dengan sections (Background, Business Objective, Scope, Stakeholder, Process, KPI, Approval). Generate dari approved KO + Requirement. Section-level review + comment. /projects/[id]/brd list + detail.
- [M4] FSD model dengan sections per modul (Process Flow, Business Rule, Data Model, Integration, Acceptance Criteria). Generate dari approved BRD + Requirement. /projects/[id]/fsd list + detail.
- [M7] QA Checklist + Item model per FSD module. Generate test case dari acceptance criteria. Pass/Fail + comment. /projects/[id]/qa.
- [M8] UAT Scenario model linked Requirement REQ-NNN. Steps + expected + actual. PASS/FAIL/BLOCKED. /projects/[id]/uat.
- [M3] Reusable regen pattern (BRD section, FSD section, Requirement description). genericDocumentRegen.service.ts AI rewrite.
- [M11 v1] Impact Engine forward graph KO → Requirement → (BRD/FSD/QA/UAT placeholder). /projects/[id]/impact tree view.
- [M6] Task → Requirement link via REQ-NNN. Coverage % per Requirement. Dashboard indicator.
2026-06-04
UnreleasedM5 Requirement Traceability
Bagian II Modul 5. Requirement model dengan code REQ-001, REQ-002, ... per project. Backward lineage ke source KnowledgeObjects via M:N JSON array. Foundation untuk forward lineage ke BRD/FSD/UAT/Manual Book di M2/M4/M8/M10.
- Schema baru: Requirement model dengan seq auto-counter per project (REQ-001, REQ-002). Fields: title, description, status (DRAFT/ACTIVE/CHANGED/RETIRED), module, priority, sourceKnowledgeObjectIds JSON array, notes. Unique(projectId, seq).
- Permissions baru: requirements:read + requirements:manage. ADMIN_OPS/PM/FUNCTIONAL manage, DEVELOPER/SALES/VIEWER read.
- Endpoints: GET/POST /projects/:projectId/requirements, GET/PATCH/DELETE /requirements/:id, POST /requirements/:id/link-ko, DELETE /requirements/:id/ko/:koId.
- New page /projects/[id]/requirements: filter status+module, table dengan Code (clickable) + Title + Status badge + Module + Priority + Source KO count + Edit/Retire actions.
- Detail modal: full description + badges + Source KnowledgeObjects list (type+status+speaker+description) + Notes + Forward Lineage placeholder.
- Nav cross-link di /projects sidebar.
- Schema additif. Existing data tidak terdampak.
- Backward lineage (REQ → KO) ready. Forward (REQ → BRD/FSD/UAT) menunggu M2/M4/M8/M10.
- Brief example 'REQ-023 dipakai di BRD 3.2, FSD 4.1, UAT TC-12' — backward sudah doable.
- Next: M2 BRD Workspace atau M3 Comment Engine generalize.
2026-06-04
UnreleasedM1 Delivery Knowledge Hub (Source of Truth)
Bagian II Modul 1 dari Kaimo brief. Knowledge Objects sekarang punya field module (Sales/Accounting/Inventory) + impactScope. New page /projects/[id]/knowledge-hub aggregate per module dengan inline edit. Foundation untuk M2-M11.
- Schema additif: KnowledgeObject.module String? (free-text per project taxonomy) + impactScope Json? (array module names untuk M11 Impact Engine). New index (projectId, module).
- KnowledgeObjectService.correct + manualCreate accept module + impactScope. New updateModuleAndImpact (patch tanpa status transition, audit knowledge-object.module-update). New aggregateByModule.
- PATCH /knowledge-objects/:id/module + GET /knowledge-objects/aggregate-by-module endpoints.
- New page /projects/[id]/knowledge-hub: summary badge per module + per-module section card. Per item: type icon + status + speaker + description + impact scope badges. Inline edit form.
- Type icons: ✅ DECISION / 💬 DISCUSSION / 🐛 ISSUE / ⚠️ RISK / 💭 ASSUMPTION / 📌 ACTION_ITEM / ❓ OPEN_QUESTION / 💡 PROPOSAL / 🔄 CHANGE_REQUEST.
- Nav link di /projects sidebar: → 📦 Delivery Knowledge Hub.
- Schema additif aman. Existing KO module=null sampai reviewer assign.
- Knowledge Hub foundation untuk M2 BRD + M4 FSD + M11 Impact Engine.
- Next: M3 Comment Engine generalize atau M2 BRD Workspace.
2026-06-04
UnreleasedP8 Project Timeline Memory + AI Q&A (Project Brain)
Fitur paling penting di Kaimo brief: user tanya 'Kenapa Booking Fee jadi Titipan?' → AI trace cross-source dengan citation per event. Halaman timeline baru /projects/[id]/timeline dengan ask bar + chronological feed.
- P8 Timeline endpoint GET /projects/:id/timeline aggregate cross-source dari 5 tables (MomRecording / MomMeetingGroup / KnowledgeNote / KnowledgeObject APPROVED+CORRECTED / ProjectAuthority). Zero schema baru. Filter from/to/limit. Sort by occurredAt DESC.
- P8 AI Q&A endpoint POST /projects/:id/ask body {question}. AiService.answerProjectQuestion strict anti-halusinasi: kalau gak ada bukti relevant di timeline, jawab 'Tidak ada bukti spesifik di history project'. Schema JSON wajib citations array dengan sourceType + sourceId + title + reason.
- P8 Frontend /projects/[id]/timeline page: ask bar di atas (input + tombol Tanya AI), result card hijau dengan answer + citations badge. Timeline feed grouped by date, per event icon by sourceType (🎙 Meeting / 📅 Group / 📝 Note / 💡 KO / 👤 Authority) + colored left border + actor + time + summary.
- Filter dropdown timeline: ALL / MEETING / NOTE / KO / AUTHORITY.
- Nav cross-link di /projects sidebar detail.
- Zero new schema. Pakai existing data sebagai event source.
- AI Q&A pakai timeline summary ~3000 char sebagai grounding. Strict citation enforcement via JSON schema.
- Audit log: projects.qa.ask dengan questionLength + citationsCount.
- Semua 8 Foundation Priorities selesai (P1-P8). Next: Bagian II M1-M11 Delivery Knowledge Hub.
2026-06-04
UnreleasedPre-Meeting Package P3 + MoM Evidence P5
MoM v2 panel sekarang punya 2 card baru di atas Document Header: Pre-Meeting Context (Open Actions / Questions / Pending Decisions / Recent Notes) sebagai AI grounding, plus Supporting Evidence aggregator (semua file dari linked notes dengan icon kategori).
- P3 Pre-Meeting Package: GET /projects/:id/pre-meeting-package endpoint baru. Return openActions, openQuestions, pendingDecisions, approvedDecisions, recentKnowledgeNotes, previousMeetings dengan counts summary.
- P3 UI MomV2PreMeetingCard: collapsible card di MoM v2 panel. Visual amber kalau ada pending review, slate kalau cuma history, green kalau fresh project. Badge counts per kategori + expand untuk detail.
- P5 MoM Supporting Evidence: MomService.fetchMeetingEvidence aggregate semua KnowledgeNote cross-sourceType (bukan cuma MANUAL_NOTE) yang linked ke recording/group + attachments READY/SKIPPED + legacy evidenceFileKey.
- P5 UI MomV2EvidenceSection: group per note dengan source badge + sourceOwner + date. List attachment dengan file icon (📕 PDF, 📊 Excel, 📽 PPT, 🖼 Image, 🎵 Audio, 🎬 Video, 📄 Word), file size, Whisper duration, RAG badge, Lark Drive link.
- Brief P5 problem: 'meeting bahas file, file tidak masuk MoM, 6 bulan kemudian hilang' → solved.
- Backend additif. Existing UI gak break.
- Evidence query single Prisma + nested include (no N+1).
- Sprint B (P3+P5) selesai. Next: Sprint C → P8 Project Timeline Memory (big).
2026-06-04
UnreleasedProject Foundation P2 polish + Task 2.0 P7 enums
Wrap-up Phase A: Foundation dapat field Goal Project multi-array (per brief) + label refinement. MomTaskDraftItem dapat enum category (FUNCTIONAL/TECHNICAL/DOCUMENTATION/DATA_MIGRATION/TRAINING/UAT) + source (MEETING/EMAIL/WA/KNOWLEDGE_NOTE) dengan dropdown di task editor.
- P2: Schema ProjectFoundation.goalProject Json? (additif, multi-goal array per brief — e.g., 'Go Live Odoo 19', 'Replace Odoo 14'). UI textarea 'Goal Project (per baris)' di Foundation tab dengan placeholder contoh.
- P2: Label refinement — 'Business Objective' → 'Business Objective / Background' (align dengan brief 'kenapa project ini ada'). 'Known Issues' → 'Known Problems / Issues'.
- P7: Schema MomTaskCategory enum (FUNCTIONAL/TECHNICAL/DOCUMENTATION/DATA_MIGRATION/TRAINING/UAT) + MomTaskSource enum (MEETING/EMAIL/WA/KNOWLEDGE_NOTE). Both nullable additif di MomTaskDraftItem.
- P7: UI MomTaskDraftPanel — 2 dropdown baru Category + Source di samping Priority. Default '—' (null), format display human-readable. Service normalizer validate enum + null untuk kosong.
- Schema additif (nullable). Deploy aman dengan pnpm prisma:db:push.
- Backward compat: existing task tanpa category/source render '—'. Existing Foundation tanpa goalProject render kosong.
- Phase A (P1+P2+P7) selesai. Next phase: Sprint B (P3 Pre-Meeting Package + P5 Evidence tab).
2026-06-03
UnreleasedMember Management Foundation (Kaimo Priority 1)
Master data orang sebagai anchor identitas untuk semua knowledge entity. MoM attendees wajib dari Member master + dropdown. KnowledgeNote sourceOwner + ProjectAuthority dapat memberId FK link.
- Schema baru: Member master (global, kind INTERNAL/EXTERNAL, status, nickname/email/phone/jabatan/divisi/skill/company/authorityText) + ProjectMember junction (side KAITECH/CLIENT/THIRD_PARTY + roleOnProject). Plus 3 enums. Additif: nullable FK memberId di ProjectAuthority + sourceOwnerMemberId di KnowledgeNote.
- Permissions baru: members:read (VIEWER/SALES/DEVELOPER) + members:manage (SUPER_ADMIN/ADMIN_OPS/PM/FUNCTIONAL).
- Endpoints: /members CRUD + /members/search (dropdown autocomplete) + /projects/:id/members junction. Soft delete (status INACTIVE) untuk preserve FK integrity di MoM history.
- /members standalone page dengan tabs Internal/External/All + search + filter + modal CRUD form-toggle-per-kind.
- MemberPicker + MultiMemberPicker reusable components (debounced 250ms search, allowCreate CTA, chip-based multi-select dengan inline role editor).
- Foundation page tab baru 'Members' (assign dari master dengan side label). Authority form dapat MemberPicker link optional. Stakeholders tab dapat info banner deprecate.
- MoM v2 attendees WAJIB dari Member master. Backend reject 400 kalau attendee tanpa memberId atau belum ter-assign ke project. Frontend dialog pakai MultiMemberPicker (showRoleEditor). HeaderCard render snapshot + 'legacy' badge fallback.
- KnowledgeNote.sourceOwner link ke Member via /notes form MemberPicker. Snapshot ke legacy sourceOwner field untuk backward compat.
- Lark sync Member master ke Bitable terpisah. Settings UI add 'Member Master Table ID' field. ProjectMember junction tidak di-sync (transient).
- Smoke test extended: member CRUD + search + project assign + reject EXTERNAL tanpa company + soft delete validation.
- Schema additif aman per memory rule. Jalankan `pnpm prisma:db:push` (dev) atau `pnpm prisma:migrate:deploy` (prod).
- Coexist tanpa migrasi: existing ProjectStakeholder + free-text sourceOwner tetap berfungsi. Migration optional per entity via UI.
- Performance: server cache 60s di /members/search (in-memory LRU) + Redis cache 60s di /projects/:id/members + indexes pada Member.(kind,status)/personName/email/nickname.
- Brief roadmap lengkap P1-P8 + M1-M11 ada di plan file Part II. Next phase: P2 polish + P3 Pre-Meeting Package + P7 Task 2.0 enums.
2026-06-03
UnreleasedMoM v2 Polish Batch 3.1 — Bug fixes + Whisper cost guard + Push modal + Refactor
Partial replacement regen jalan + visual marker + history tooltip. Whisper 30 menit cap + cost estimate. Push to Lark modal dengan 5-step progress. Legacy evidence migration endpoint. PPTX/XLSX extractor tests (+ bug fix).
- Partial replacement regen — sebelumnya AI rewrite seluruh item walaupun cuma blok sebagian. Sekarang AI return snippet pengganti + backend substitute in-place via originalText.replace(selectedText, newSnippet). Fallback ke full rewrite kalau snippet tidak ketemu.
- Visual marker + history tooltip untuk regen — <mark> di posisi regenerated portion (kuning soft + dashed border) + hover tooltip dengan originalText + comment + timestamp. Active blok pending pakai marker beda (kuning solid + 2px border).
- Selection edge case — walker pakai range.startContainer (always inside item element) bukan commonAncestorContainer yang bisa naik ke parent kalau selection cross-boundary. Fallback ke commonAncestor + endContainer.
- Narrative duplikat di Pembahasan Utama — buildMomFinalDocumentFromV2 sebelumnya prepend narrative ke bodyParagraphs → Executive Summary muncul 2x di UI + index pembahasanUtama bergeser → inline regen target item yang salah. Sekarang executiveSummary terpisah, bodyParagraphs cuma pembahasanUtama (index match 1:1).
- DOM mutation conflict dengan React — lockSelectionWithSpan crash dengan 'NotFoundError: removeChild on Node' karena DOM mutate langsung. Ganti pakai React Context (useMomV2ActiveSelection) → MomV2DocumentPreview render <mark> via JSX (zero DOM mutation).
- XLSX extractor regex — t='...' attribute cuma match kalau di awal <c> attributes. Real XLSX bisa naruh attr di urutan mana saja. Fix: capture semua attrs lalu parse t= terpisah. Ditemukan via unit test baru.
- Whisper cost guard — 30 menit cap per file audio/video + cost estimate di UI sebelum submit (~Rp 100/menit). Frontend probeMediaDuration via HTML5 Audio/Video element. Backend defense-in-depth via ffmpeg-static stdin probe (multi-user safety).
- Push to Lark modal (MomV2LarkPushModal) — replace plain window.confirm dengan real modal. Pre-push summary + 5-step progress indicator (recording/notes/docx/momIndex/state). Auto-close 3s kalau semua OK; manual close kalau partial fail.
- Legacy evidence migration endpoint — admin POST /notes/migrate-legacy-evidence (settings:manage). Untuk setiap note dengan legacy evidenceFileKey, bikin KnowledgeNoteAttachment + KnowledgeDocument + enqueue RAG ingestion. Idempotent. Legacy fields tidak dihapus.
- Unit tests PPTX + XLSX extractor — valid case + empty case. Test ungkapin bug XLSX regex (fixed).
- CSS classes proper (sebelumnya inline): .mom-ai-regen-mark, .mom-active-selection, .mom-doc-paragraph, .mom-push-progress + .mom-push-step.
- Refactor MomV2Panel (light) — extract MomV2LarkPushModal + MomV2KOSection sub-components. MomV2Panel turun ~60 lines, pattern dibangun untuk extraction selanjutnya.
2026-06-02
UnreleasedMoM v2 Polish Batch 3 — Text-selection regen + Notes multi-file + MoM Index Bitable + Native DOCX numbering
Drag-select kata/kalimat di MoM v2 → AI rewrite bagian itu. /notes standalone page multi-file upload. Lark Bitable upsert MoM Index saat Push ke Lark. Word native auto-numbering di DOCX.
- Text-selection block AI regenerate di MoM v2 Final document — user drag-select kata/kalimat di Pembahasan/Keputusan/Action Items task/Konfirmasi/Catatan → popup floating dengan textarea comment muncul di posisi selection → AI rewrite bagian itu (selected text di-quote di prompt biar fokus). MomV2DocumentPreview + MomV2RegenSelection wrapper.
- Multi-file attachments di standalone /notes page (sebelumnya cuma single legacy evidence): file picker multiple, inline list dengan status badge per file (Antri/Memproses/Siap RAG/Gagal), Lark Drive link, tombol Hapus, polling 10s saat ada PROCESSING. List view show count badge '📎 N attachment' + indikator '⟳ RAG processing'.
- Lark Bitable upsert MoM Index saat klik Push ke Lark — record dengan Project Code / Project Name / Meeting Title / Meeting Date / Document Version / Document Status / Doc URL / Pushed At. Idempotent via larkMomIndexRecordId (additif schema). Settings UI: input 'MoM Index Table ID (opsional)'. Best-effort: skip silently kalau belum dikonfigurasi.
- Native Word numbering.xml di DOCX export — Pembahasan/Keputusan/Konfirmasi/Catatan section pakai <w:numPr> reference (auto-renumbering saat user edit, proper hanging indent) bukan inline '1.' text. buildNumberingXml() emit 9 numId decimal restart-at-1 + 1 bullet.
- Schema baru larkMomIndexRecordId aman additif (nullable, no default) — pnpm prisma:db:push di dev → migration deploy ke prod.
- Inline regen untuk v1 raw items sekarang ter-cover via text selection — tidak perlu tombol per-item di MinutesDocumentPreview.
- KO items inline regen (Risks/Issues/dst) tetap pakai tombol '⟳ Regenerate AI' karena item-level.
2026-06-02
UnreleasedKaimo 2.0 Phase 3 — Polish
Reviewer Knowledge Objects sekarang bisa Approve / Correct / Reject langsung dari NEEDS_HUMAN_REVIEW + CONFLICT. UI popup pakai modal styled, bukan native browser prompt.
- DOCX export MoM Final sekarang ikut layout v1 tradisional Indonesia (Pembahasan Utama → Requirement → Keputusan → Action Items → Konfirmasi → Catatan) + section baru Manual Notes (dari KnowledgeNote MANUAL_NOTE) + Tambahan dari Knowledge Objects (Risks/Issues/Discussions/Assumptions/Open Q/Proposals/Change Requests). Filename: MoM-Final-<code>-<title>-<date>.docx.
- extractV1Supplementary juga ekstrak keputusan + actionItems dari minutesOfMeeting JSON, jadi layout tradisional bisa pakai data v1 sebagai primary.
- Export Final MoM v2 button gak respond + format gak match Minutes of Meeting tab — sekarang reuse createDocxBlob v1 langsung (sama dengan tombol Export .docx di tab Minutes of Meeting). Section tambahan v2 (Manual Notes / Knowledge Objects Approved / Sign-off / Distribution) ditambah lewat MomExportDocument.extras field baru.
- 'Invalid Date' di header v2 — formatDateTime sekarang cek isNaN(d.getTime()) return '—' untuk value invalid.
- Typo vv1.0 di badge document version — kalau v1 AI generate dengan prefix 'v' (mis. 'v1.0'), badge jadi double vv1.0. Strip leading v/V di normalisasi.
- manualNotes di MoM v2 response — service fetch dari KnowledgeNote dengan filter sourceType=MANUAL_NOTE AND (recordingId OR meetingGroupId).
- MoM v2 jadi real MoM document — native header (Tanggal/Lokasi/Topik/Notulis/Versi/Status/Peserta) editable, AI Narrative Executive Summary, Sign-off (Approver + auto-bump status), Distribution list, Export DOCX dengan watermark DRAFT untuk dokumen yang belum FINAL. Zero migration — semua persist ke summary Json existing.
- 10 endpoint baru di MoM controller untuk doc-metadata + narrative + signoff + distribution (5 ops × 2 scope recording/group). Semua mom:manage + audit log.
- Kolom Description di Lark sekarang berisi gabungan struktur 3 section: Arahan: <guidance> + Description: <description> + Goal: <goal>, dipisah blank line. Untuk user dengan 1 kolom Notes/Description tanpa kolom terpisah — semua konteks operasional masuk. User dengan kolom terpisah tinggal map di field mapping (override behavior gabungan).
- normalizeEmployee extract Lark open_id dari kolom user-type (Person, Owner). Pakai helper extractLarkUser yang traverse array → ambil pertama → ekstrak id + name. Plus bracket access untuk kolom dengan dot (mis. 'Person.Work email').
- Field key `assigneeUser` untuk auto-assign ke kolom Lark tipe `user` (e.g. `Owner`). Web sudah punya picker employee — sekarang waktu commit, kalau `assigneeUser` di-mapping, service kirim format Lark user object [{id: open_id}] alih-alih text. Default mapping JSON include `"assigneeUser": "Owner"`.
- Root config.fields mapping nggak nyampe ke target individual — listTaskTargets bangun target dari bases[].taskTargets[], tapi field mapping JSON yang user save ada di root config.fields. Sebelumnya target's .fields selalu undefined → createTasks baca empty fieldMap → semua field skip → empty record. Sekarang root-level config.fields di-propagate ke semua target yang belum punya fields sendiri.
- Refuse commit kalau semua task produce empty fields. Sebelumnya kalau mapping JSON tidak match Bitable, service kirim {fields: {}} → Lark create record kosong (data hilang silent). Sekarang detect kondisi all-empty → return error eksplisit per task: 'Update mapping JSON di Settings → Lark Base routing'.
- Detailed populateSession error log saat regenerate gagal: session id, source, target config (appToken/tableId set/MISSING), dan error stack — sebelumnya cuma errorMessage di DB.
- Lark Bitable FieldNameNotFound saat commit task — service sebelumnya selalu fallback ke nama default English ('Title', 'Technical Function', dst). Lark reject seluruh record kalau salah satu field name tidak ada. Sekarang field tanpa mapping di-skip silent. Priority di-normalize ke TitleCase (HIGH → High).
- Stale session snapshot setelah Settings → Lark Base routing diubah mid-session. resolveSessionTarget ignore snapshot kalau incomplete (no appToken / no tableId) → fallback ke default first target dari config terkini.
- Default field mapping JSON di Settings UI match key yang ditulis service (technicalFunction, guidance, goal, assigneeName, assigneeEmail, source, draftItemId). Lama (assignee, status, duplicateOf) dihapus — status & duplicateOf tidak pernah ditulis service, assignee dipecah jadi assigneeName + assigneeEmail.
- OpenClaw dropped full — Lark Bitable diakses langsung via Lark Open API. MoM Task Draft commit pakai tenant_access_token + batch_create_records. Config tetap di webSetting.lark.baseConfig (UI Lark Base routing kompatibel).
- Project sync auto dari OpenClaw dihapus. Log spam 'OpenClaw Lark agent gagal: Unknown action: fetchProjects' hilang. Project dibuat manual via Phase 1 flow.
- Env vars dihapus: OPENCLAW_LARK_AGENT_URL, OPENCLAW_LARK_AGENT_TOKEN, OPENCLAW_LARK_BASE_CONFIG, OPENCLAW_LARK_TIMEOUT_MS.
- MoM v2 sekarang menarik suplemen dari MoM v1: Pembahasan Utama, Requirement Items table, Konfirmasi Lanjutan, Catatan Tambahan, dan header tradisional (topic/location/participants/note taker/dst). v1 tetap dipertahankan; v2 jadi lebih kaya tanpa kehilangan format familiar.
- Kalau belum ada Knowledge Object APPROVED, MoM v2 tetap render suplemen v1 + warning banner — bukan empty state.
- State machine longgar: NEEDS_HUMAN_REVIEW + CONFLICT bisa transisi ke APPROVED / CORRECTED / REJECTED. Audit log mencatat override.
- Modal Approve / Correct / Reject dengan style konsisten halaman Project/Ticket/Assistant. Warning eksplisit kalau aksi override safety net (RULE 1/3/5/6).
- Tab Manual Notes di halaman MoM kembali ke desain sederhana: 1 textarea bebas + Save.
- MoM generation crash OpenAI 400 'Missing sourceQuote in required'. Strict mode: semua key knowledgeObjects.items wajib di required, optional fields jadi nullable.
- pnpm-lock.yaml outdated memblok Coolify --frozen-lockfile install setelah tsx ditambahkan.
- Setelah deploy, re-run `pnpm prisma:seed` di container API untuk grant permission baru (knowledge.notes:*, knowledge.object:*) ke role existing. Tanpa ini sidebar Notes flicker.
2026-06-02
Phase 3dGolden Set Evaluation Framework
- Sample case JSON di apps/api/eval/golden-set/* dengan transcript + expected KnowledgeObject.
- Runner pnpm scripts:eval-golden boot Nest, panggil AiService.generateMomInsights, hitung precision/recall/F1.
- Report markdown ke apps/api/eval/reports/<timestamp>.md.
- Threshold default F1=0.70 (EVAL_F1_THRESHOLD env). Exit code 1 kalau di bawah → siap untuk CI gating.
- Migrasi script execution: ts-node → tsx (lebih ringan, native ESM).
2026-06-02
Phase 3cMoM v2 — Final Assembly dari Approved Knowledge
- Tab Final MoM v2 di halaman MoM merakit dokumen dari Knowledge Objects ber-status APPROVED.
- Setiap baris (Decision/Action Item/Risk/dst) membawa source quote verbatim untuk traceability.
- Executive Summary auto-generated.
2026-06-02
Phase 3bRULE 3 — Authority Validation untuk Decision
- Decision dengan kata-kata approval ('setuju', 'approved', 'OK', 'ACC', dst) di-validate balik ke Authority Registry project.
- Kalau speaker tidak terdaftar dengan canApprove=true, status auto NEEDS_HUMAN_REVIEW dengan reason eksplisit.
- Lookup mendukung effective window (effectiveFrom/effectiveTo).
2026-06-02
Phase 3aKnowledge Objects + Anti-Halusinasi
- 9 type Knowledge Object: DECISION, DISCUSSION, ISSUE, RISK, ASSUMPTION, ACTION_ITEM, OPEN_QUESTION, PROPOSAL, CHANGE_REQUEST.
- State machine EXTRACTED → NEEDS_HUMAN_REVIEW | READY_FOR_REVIEW | CONFLICT → APPROVED | CORRECTED | REJECTED.
- RULE 1: DECISION tanpa source quote / evidence → NEEDS_HUMAN_REVIEW.
- RULE 5: confidence < 0.6 → NEEDS_HUMAN_REVIEW.
- RULE 6: source quote ≥ 10 karakter harus verbatim di transcript (substring match).
- Correct membuat versi baru APPROVED; original ditandai CORRECTED. Versioning via canonicalId.
- Tab Knowledge di MoM page dengan filter status + grouping per type.
2026-06-02
Phase 2c+2dNote Evidence File + Lark Drive Sync
- Evidence file opsional di Note: screenshot WA, attachment email, voice note, dll.
- Upload multipart ke MinIO + auto-mirror ke Lark Drive <Project>/Notes/<source>/.
- Kolom evidenceDriveFileToken + evidenceDriveFileUrl di KnowledgeNote.
2026-06-02
Phase 2Notes — Multi-Source Knowledge Capture
- Model KnowledgeNote + 10 source type (MANUAL_NOTE, WHATSAPP, EMAIL, COFFEE_DISCUSSION, SITE_VISIT, VOICE_NOTE_SUMMARY, PHONE_CALL_SUMMARY, WORKSHOP, INTERNAL_DISCUSSION, OTHER).
- Halaman /notes standalone dengan filter, tabel per project, modal form.
- Tab Manual Notes di MoM page yang otomatis di-attach ke recording/group.
- NotesService.findForMomContext dibaca AI saat generate MoM untuk grounding.
- Permission keys baru: knowledge.notes:read, knowledge.notes:manage.
2026-06-02
Phase GMoM Recording → Lark Drive
- MomRecording.status=COMPLETED di-mirror ke Lark Drive <Project>/MoM/<group>/.
- Kolom larkDriveFileToken, larkDriveFileUrl, larkSyncedAt di MomRecording.
- Script scripts:backfill-mom-drive untuk backfill recording lama.
2026-06-02
Phase FProjectFile → Lark Drive per Kategori
- Setiap upload ProjectFile di-mirror ke Lark Drive <Project>/Files/<Category>/.
- Kolom larkCategoryFolders (JSON map kategori → folder token) di Project.
2026-06-02
Phase BOpenAI Usage Auto-Sync + Manual Credit Balance
- Queue openai-usage-sync panggil OpenAI Admin API /v1/organization/costs.
- Cost MTD ditampilkan di Settings; konversi USD→IDR via rate runtime.
- Manual creditBalanceUsd input (OpenAI tidak expose balance via API).
- Computed remaining = balance - actualCostUsdMtd dengan warning badge kalau habis.
2026-06-02
Lark Direct APIMigrasi dari lark-cli shell-out ke direct HTTP
- LarkFoundationSyncService pakai HTTP Lark Open API langsung (fetch + tenant_access_token caching 2 jam).
- Hapus dependency runtime lark-cli.
- Settings UI: connect (appId + appSecret), test connection, disconnect.
2026-06-02
Phase 1Project Foundation + Authority Registry
- ProjectFoundation (1:1 Project) — vision, business objective, scope, out of scope, timeline, organization structure, known issues/risks/assumptions, current SOP/Flow, publishedAt.
- ProjectStakeholder — Client/Kaitech/Third Party, bisa di-tag FUNCTIONAL_LEAD / DEVELOPER_LEAD / PROJECT_MANAGER.
- ProjectAuthority — siapa yang boleh approve apa (scope: FINANCE, TECHNICAL, COMMERCIAL, FINAL_APPROVER, OTHER).
- ProjectFile — versioned files dengan 13 kategori (PROPOSAL, CONTRACT, BRD, FSD, dst).
- GET /projects/:id/context-package — payload tunggal otomatis disisipkan ke prompt LLM.
- Tab Foundation / Stakeholders / Authority / Files di halaman project.
- Lark Base mirror untuk Foundation / Authority / Stakeholders / Files Index.
- Permission keys: projects.foundation:*, projects.authority:*, projects.stakeholder:*, projects.file:*.
- canonicalId di MomInsight + MomTaskDraftItem (siap untuk versioning Knowledge Object).
- sourceQuote di MomTaskDraftItem.
- Enum NEEDS_HUMAN_REVIEW di MomTaskDraftItemStatus.