Lex Origin MVP — Weekly delta
Week ending: 24 October 2026
Report lineage: incremental delta on top of CLIENT_READINESS_REPORT_2026-10-05.md. Mirrored into the live planning doc Lexorigin platform — 3-month projection (section 9) so both stay in sync.
Author: Arjun Kumar (Contractor)
This file lists what shipped (code-complete locally; some branches not yet merged) during the week of 18–24 October 2026, mapped to Annexure A features where it moves the readiness verdict, and to platform-UX capabilities that aren't contract-named but matter for pilot-readiness.
Honest caveat up front: everything listed below sits in local branches as of 24 Oct 2026. None of this is live on the deployed platform until the uncommitted work in
lexai-client-fe,authservice, andprism-serviceis pushed and the readiness engine is re-run. Flagged where it matters.
1. Scope-coverage delta vs. 5 Oct 2026 report
Features that advanced status
| Annexure A feature | 5-Oct status | 24-Oct status | What changed this week |
|---|---|---|---|
api-supreme-high-court — SC + High Court APIs (case updates, judgments) |
needs_work (controller present, no live data flow) |
Materially advanced (still needs_work pending merge + manual eval) |
New prism-service/app/services/ecourts/ client + parser integrated with eCourts partner API. CNR lookup endpoint /lookup/by-cnr fans out to India Kanoon + eCourts in parallel, merges results. Backed by new tables prism_cnr_searches, prism_cnr_payload_cache, prism_order_pdf_cache (Alembic migrations 012-014). Verified live against DLCT020279742026 (Gorkha Security Services vs Sarita) and DLHC010296942026. |
case-management-infrastructure |
needs_work (controller + model, no end-to-end flow) |
Materially advanced | New per-case detail page at /workspace/dashboard/cases/detail?id=<uuid> with status strip, parties & representation grid, acts & sections, hearings timeline merging eCourts hearings + India Kanoon published docs + interim/judgment orders. Signed order PDFs stream through our server with a forever-cache (immutable artifacts). |
library-core — unified legal library |
needs_work |
Materially advanced | Judgment library now reachable from search history (clicking an IK match deep-links to /workspace/dashboard/cases/[ikId]); CNR tracker's "Published documents" rail populates from the same India Kanoon source. |
api-gst — GST Portal (notifications, filings) |
needs_work (sandbox controller only) |
Materially advanced | New authservice/src/clients/gst/ module: Whitebooks client (whitebooks.client.ts), orchestrator service, REST controller with 4 endpoints (status, otp-request, otp-verify, sync-notices), rate-limited and auth-gated. OTP → authtoken flow verified end-to-end against live Whitebooks production (txn + session token returned, IP-pinned, 30-day session). /notices/noticelist endpoint-name blocked on Whitebooks support (Abhiram) — ~1 week ETA. |
client-management |
Partial | Hardened | New GST-portal fields on Client schema: gst_portal_username, gst_api_access_enabled_on, gst_api_session_token, gst_api_session_expires_at, gst_api_pending_txn, gst_api_session_ip. UI surfaced on Settings → Tax & Registration tab. Pair-with-client flow lets a CNR tracker case be linked to an existing workspace client. |
Hardening work (improves zero-critical-bugs Annexure C metric)
| Issue | File | Impact |
|---|---|---|
PracticeTypeGuard throwing misleading "A workspace is required" 403 for every authenticated workspace owner's call behind any @RequirePracticeType route |
authservice/src/common/guards/practice-type.guard.ts |
20+ controllers unblocked — cases, payroll, timesheet, audit, compliance-calendar, mis, ca-dashboard, ca-billing, bank-recon, accounting, coa, salary-structure, employee-exit, attendance-leaves, tally, zoho-books, sandbox, certifications. One-line fix (if (!user) return true) but systemic impact. |
Contracts page row click → /alias/undefined/dashboard/contracts/<id> → middleware bounces to /workspace?undefined= → looks like a logout |
lexai-client-fe/src/app/alias/[workspace-alias]/dashboard/contracts/page.tsx |
Fixed by using useUserType().basePath for route-aware navigation; works on both owner + alias trees. |
MattersList crashing with "Objects are not valid as a React child {isUnknown, name, address}" on the first visible case |
lexai-client-fe/src/components/dashboard/MattersList.tsx |
Added partyLabel() helper; both legacy string-shaped parties and current object-shaped parties render safely. |
ClientSearchAutocomplete silently showing "No clients found" everywhere — misreading the wrapped response shape (response.data.data.data vs response.data.clients) |
lexai-client-fe/src/components/ClientSearchAutocomplete.tsx |
Defensive parse trying 4 known shapes; same pattern applied to noticeIntakeService.searchClients and noticeIntakeService.listForWorkspace. |
/api/v1/notices?workspaceId=... returning 400 "property workspaceId should not exist" |
lexai-client-fe/src/services/noticeIntakeService.ts |
DTO uses forbidNonWhitelisted: true; dropped workspaceId from query (resolved from JWT instead). |
New platform capabilities not in Annexure A but critical for pilots
| Capability | Where |
|---|---|
| Dedicated per-CNR case detail page with status + parties + timeline + order PDF viewer (inline + download) | lexai-client-fe/src/app/workspace/dashboard/cases/detail/page.tsx |
| In-app PDF viewer for signed court orders (served from local forever-cache after first fetch — no eCourts credit after that) | Backend: prism-service/app/api/v1/endpoints/cases.py (new /lookup/order-copy/{cnr}/{file} proxy). Frontend: iframe render in detail modal + download button. |
| Search history table unifying CNR lookups + judgment views, chronologically sorted, with filter chips | lexai-client-fe/src/components/dashboard/SearchHistoryTable.tsx |
| Pair-with-client — link a CNR tracker case to any workspace client via autocomplete | Frontend: new PairWithClientDialog in detail page. Backend: linked_client_id on prism_cnr_searches + /link-client PATCH endpoint (migration 014). |
Notices page restructure — tabbed layout (All notices / Settings) replacing a 15-widget stacked wall. Primary list is now visible on page load; AI drawer moved to dedicated detail route /notices/[notice_id]. |
lexai-client-fe/src/app/workspace/dashboard/notices/page.tsx + [notice_id]/page.tsx |
AI chat UI for notice drafting — ChatGPT-style message bubbles + quick-action chips + right-rail upgrade CTA, replacing the form-stuffed AIWorkspacePanel card |
lexai-client-fe/src/components/notices/NoticeAiChat.tsx |
| Workspace-wide "Pick a client → fetch GST notices" CTA + roll-up table showing every client with GST portal credentials configured, per-client session state, Fetch/Open actions | lexai-client-fe/src/components/notices/WorkspaceNoticesRollup.tsx |
| New top-level sidebar entry "Notices" (both owner + alias trees) + Permission context + Role config entry | DashboardSidebar.tsx, PermissionContext.tsx, RoleConfigurationContext.tsx |
Session IP pinning for Whitebooks GST sessions (Whitebooks binds a session to its originating egress IP; mismatch = NOTC_001 Unauthorized). New WhitebooksClient.getEgressIp() resolves via ipify (overridable via WHITEBOOKS_SOURCE_IP env), persisted to client.gst_api_session_ip so verify + sync + refresh all reuse the same IP. |
authservice/src/clients/gst/whitebooks.client.ts, clients-gst.service.ts |
Still blocked / outstanding external deps
| Item | Status | Owner |
|---|---|---|
Whitebooks GST noticelist correct endpoint for Section 46 return-defaulter notices |
Awaiting support reply (Abhiram) | External (~1 week ETA) |
Microsoft SECRET_VALUE rotation (compromised: previously committed to CLAUDE.md plaintext) |
Deferred to pre-launch | Partner decision |
| Admin FE sessionStorage residual XSS risk (Gap 27) | Deferred to pre-launch | Partner decision |
2. Acceptance-metric (Annexure C) impact
None of the 12 Annexure C metrics flipped this week. All remain ❌ Unmet. Specific movement:
zero-critical-bugs— net better: 5 user-facing crashes fixed, no new ones introduced in this week's changes. Stillneeds_workbecause no documented UAT run exists.drafting-turnaround-reduced-70— chat UI should improve subjective drafting speed, but no baseline was measured, so can't flip topass. Would require: baseline time-to-first-draft measurement before chat UI (missed), vs after (measurable now).ai-accuracy-98— unchanged. New chat surface is a UI change, not a model change.documentation-complete— this file + the planning doc on Claude Docs are starts, but admin/user guides + KT sessions are not written.
3. What to do before next readiness run
Before the readiness engine's next automated re-run (npm run readiness from readiness/), these need to happen so the delta above shows up correctly in the next scheduled latest.md:
- Commit + push the uncommitted work in
lexai-client-fe,authservice,prism-service(currently all on local branches). - Edit
readiness/manual-verdicts.yamlto flipapi-supreme-high-court,case-management-infrastructure,library-core,api-gstfromneeds_work→needs_workwith sharper evidence (notpass— the engine's rule is that output quality must be manually walked in UI first, which still needs a human reviewer sign-off). - Re-run
npm run readinessto regeneratereadiness/reports/latest.md. - If the pass/fail count changes, update
CLIENT_README.mdsection 1 bullets.
Keep this file + the project planning doc in Claude Docs in sync. If one changes, update the other in the same session so partner + contractor are always reading the same version of reality.