Rilis & update

Changelog

Riwayat perubahan kaitech-core untuk tim internal Kaitech. Mirror dari 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.

Fixed2 item
  • 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.

Added4 item
  • 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.

Added3 item
  • 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.

Added3 item
  • 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).

Added6 item
  • @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.

Added4 item
  • 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.

Added4 item
  • 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.

Added3 item
  • 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.

Added3 item
  • @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'.

Added5 item
  • 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.

Added2 item
  • 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.

Added3 item
  • 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 ✓/⚠.

Added5 item
  • 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.

Added4 item
  • 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).

Added4 item
  • 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.

Added3 item
  • 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.

Added6 item
  • 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).

Fixed3 item
  • 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.

Fixed7 item
  • 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.
Added4 item
  • 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).
Fixed1 item
  • 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.

Fixed4 item
  • 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.

Added4 item
  • 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.

Added4 item
  • 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).
Changed3 item
  • 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.

Added8 item
  • [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.
Removed3 item
  • [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=).
Notes2 item
  • 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).

Added2 item
  • /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.
Fixed3 item
  • 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.

Added5 item
  • 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.

Fixed1 item
  • Pre-existing test fail di apps/api/test/operations.spec.ts (mock alignment).
Added2 item
  • 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).

Added4 item
  • 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.
Changed2 item
  • 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).

Added7 item
  • [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.

Added6 item
  • 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.
Notes4 item
  • 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.

Added6 item
  • 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.
Notes3 item
  • 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.

Added5 item
  • 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.
Notes4 item
  • 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).

Added5 item
  • 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.
Notes3 item
  • 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.

Added4 item
  • 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.
Notes3 item
  • 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.

Added10 item
  • 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.
Notes4 item
  • 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).

Fixed6 item
  • 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.
Added6 item
  • 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.

Added4 item
  • 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.
Notes3 item
  • 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.

Changed2 item
  • 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.
Fixed3 item
  • 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.
Added6 item
  • 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"`.
Fixed5 item
  • 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.
Changed4 item
  • 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.
Added5 item
  • 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.
Fixed2 item
  • 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.
Notes1 item
  • 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

Added5 item
  • 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

Added3 item
  • 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

Added3 item
  • 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

Added7 item
  • 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

Added3 item
  • 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

Added5 item
  • 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

Added3 item
  • 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

Added2 item
  • 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

Added4 item
  • 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

Changed3 item
  • 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

Added8 item
  • 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:*.
Foothold (Phase Berikutnya)3 item
  • canonicalId di MomInsight + MomTaskDraftItem (siap untuk versioning Knowledge Object).
  • sourceQuote di MomTaskDraftItem.
  • Enum NEEDS_HUMAN_REVIEW di MomTaskDraftItemStatus.